首页 > 代码库 > 最短路径 简单的代码
最短路径 简单的代码
看了这些代码之后 总结了一下 其实就那三个for 循环 一:找与v有连接的点 。二:从这些连接的点找到最小,把他看成是下一次的v 。 三: 你要把有出现的那些边 更新掉 。 详解在代码里写出了 #include#include#includeusing namespace std ;#define N 100#define M 100typedef 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 ;}如果没有看懂 看看这个链接 不再患得患失 的文章
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。