标签:style blog color for 代码 div amp size
看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 。二:从这些连接的点找到最小,把他看成是下一次的v 。 三: 你要把有出现的那些边 更新掉 。 详解在代码里写出了 #include #include #include using namespace std ; #define N 100 #define M 100 typedef struct node { int matrix[N][M] ; int n ; int e ; }Dgraph ; void DijistraPath(Dgraph g , int *dist , int *path , int V0) { int i , j ; //申请两个 int 类型的 指针 visit 用来记录 某些点是否已经被访问过 bool *visit = (bool *) malloc(sizeof(bool )* g.n) ; for(i = 0 ; i < g.n ; i++){ if(g.matrix[V0][i] > 0 && i != V0 ) { dist[i] = g.matrix[V0][i] ; path[i] = V0 ; //path记录最短路径上从v0到i的前一个顶点 } else { dist [i] = INT_MAX ; path[i] = -1 ; } visit[i] = false ; //这些i 都还没被访问过 先标记一下 path[V0] = V0 ; dist[V0] = 0 ; } visit[V0] = true ; //第一个循环是要把每个点 都进行 下面的操作 需要n 次 for(i = 1 ; i < g.n ; i++){ int u ; //用来记录 最小的那个点的 位置 int min = INT_MAX ; // 找到最小的那个点 for(j = 0 ; j < g.n ; j++ ){ if(visit[j] == false && dist[j] < min ) { min = dist[j] ; u = j ; } } visit[u] = true ; //下面我们要把 dist 更新一遍 因为可能V0 到某个点直接距离 比 从其他路线还要长 //所以把那个dist 改成 更短的 for(i = 0 ; i < g.n ; i++ ){ if(visit[i] == false && g.matrix[u][i] > 0 && min + g.matrix[u][i] < dist[i]) { dist[i] = min + g.matrix[u][i] ; path[i] = u ; } } } } int main() { int i , j ; int n , e ; int V0 ; int s , t , w ; int x ; Dgraph g ; while(cin>>n>>e && e != 0) { // disti[] 用来放从 原点到第i个的最短距离 //path[i] 用来放 i被访问的前一个点 int *dist = (int *)malloc(sizeof(int)*n) ; int *path = (int *)malloc(sizeof(int)*n ) ; // 先把g.matrix(就是权值)初始化 for(i = 0 ; i < N ; i++){ for(j = 0 ; j < M ; j++){ g.matrix[i][j] = 0 ; } } g.n = n ; g.e = e ; //这里是输入 每条边的 权值 for(i = 0 ;i < e ;i++ ){ cin>>s>>t>>w ; g.matrix[s][t] = w ; } cin>>V0; //输入原点 DijistraPath( g , dist , path , V0) ; cin>>x; cout<<dist[x] ; } return 0 ; } 如果没有看懂 看看这个链接 不再患得患失 的文章
标签:style blog color for 代码 div amp size
原文地址:http://www.cnblogs.com/0307jtx/p/3879862.html