Dijkstra算法
题目:畅通工程
参考了其他的博客
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n, m, s, t; int e[120][120], dis[120]; //e用来存储各村庄(点)相通边长的情况,d用来存储权值 (即边的长度) bool vis[120]; //Dijkstra算法 void Dijkstra(int src) { //初始化 for(int i = 1; i <= n; i++) { dis[i] = e[src][i]; //把目标点与其他点的距离存到距离数组中去 vis[i] = 0; //均为连通 } dis[src] = 0; vis[src] = 1; int k, tmp;//均为标记变量 for(int i = 0; i < n; i++) { tmp = 19920603; for(int j = 0; j < n; j++) if(!vis[j] && tmp > dis[j]) { k = j; tmp = dis[j]; } if(tmp == 19920603) break; vis[k] = 1;//标记为1,已连通 //更新路径最短 for(int j = 0; j < n; j++) if(!vis[j] && dis[j] > dis[k]+e[k][j]) dis[j]=dis[k]+e[k][j]; } } int main() { while(cin>>n>>m) { int u,v,w; //初始化 for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) e[i][j] = 19920603; //赋值 for(int i = 0; i < m; i++) { cin>>u>>v>>w; if(e[u][v] > w) e[u][v] = e[v][u] = w; } cin>>s>>t;//s起点,t终点 Dijkstra(s); if(dis[t] == 19920603) cout<<"?"<<endl; else cout<<dis[t]<<endl; } return 0; }
                    
                
                
            
        
浙公网安备 33010602011771号