• graph-Dijkstra's shortest-path alogorithm


    直接贴代码吧,简明易懂。

    后面自己写了测试,输入数据为:

    a
    b
    c
    d
    e
    0 1 4
    0 2 2
    1 2 3
    1 3 2
    1 4 3
    2 1 1
    2 3 4
    2 4 5
    4 3 1

    也就是课本上111的图4.9(上面为原图,下面为结果)

    程序的输出结果为:

    #include <iostream>  
    #include <string>
    using namespace std;  
    
    const int maxVertexNum = 20;
    const int INF = 99999;
    
    typedef struct dGraph{
    	// vertexes
    	string vertex[maxVertexNum];
    	// edges
    	int edges[maxVertexNum][maxVertexNum];
    	int vertexNum;
    	int edgeNum;
    	// construct a graph
    	void set(int n, int e) {
    		vertexNum = n;
    		edgeNum = e;
    		//cout << "input vertex" << endl; 
    		for (int i = 0; i < n; i++)
    	        cin >> vertex[i];
    	    for (int i = 0; i < n; i++) 
    		    for (int j = 0; j < n ; j++)
    		        edges[i][j] = INF;
    		//cout << "input edge" << endl; 
    	    int weight;
    	    for (int m = 0; m < e; m++) {
    	    	int i,j;
    	    	cin >> i >> j >> weight;
    			edges[i][j] = weight; 
    		}
    	}
    	// Dijkstra's shortest-path alogorithm
    	void shortestPathDj(int v) {
    		bool visited[vertexNum] = {false};
    		int dist[vertexNum] = {INF};
    		string path[2 * vertexNum];
    		
    		// initiation
    		for (int i = 0; i < vertexNum; i++) {
    			dist[i] = edges[v][i];
    			if (dist[i] < INF)
    			    path[i] = vertex[v]+vertex[i];
    			else
    			    path[i] = "";
    		}
    		dist[v] = 0;
    		visited[v] = 1;
    		//
    		int min;
    		int i, j, k;
    		for (j = 1; j < vertexNum; j++) {
    			min = INF;
    			// find shortest edge.
    			for (i = 0; i < vertexNum; i++) {
    				if (dist[i] < min && visited[i] == false) {
    					min = dist[i];
    					k = i;
    				}
    			}
    			visited[k] = true;
    			cout<<path[k]<<" "<<dist[k]<<endl;
    			for (i = 0; i < vertexNum; i++) {
    				if (dist[i] > dist[k] + edges[k][i] && visited[i] == false) {
    					dist[i] = dist[k] + edges[k][i];
    					path[i] = path[k] + vertex[i];
    				}
    			}
    		}
    	}
    	
    } dGraph;
    
    int main() {
    	freopen("in.txt", "r", stdin);
    	dGraph G;
    	G.set(5,9);
    	G.shortestPathDj(0);
    	return 0;
    }
    

      

  • 相关阅读:
    Jquery 实现banner图滚动效果
    常用正则表达式集锦
    获取客户端ip并用正则表达式验证
    锋利的jquery学习笔记
    ASP.NET 中DataGrid item 绑定方法
    SQL float 保留两位小数
    android 应用程序中执行Linux 命令
    UBUNTU 测试跑分
    The declared package..does not match the expected package..
    mybatis 配置文件 配置别名
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6602371.html
Copyright © 2020-2023  润新知