http://acm.hdu.edu.cn/showproblem.php?pid=1874
中文题,纯单源最短路径。
题目有点小坑,就是在输入权值时,要判断下,
如:之前输入了g[1][4] = 100, 但是可能后面还有输入g[1][4] = 200
View Code
/** * DIJKSTRA(简单版) 单源最短路径算法(不允许存在负边) * 输入:(1)图g; // 有向图或者无向图 * (2)源点s。 * 输出:(1)源点s到各点的最短路径长dist; * (2)源点s到各点的最短路径prev。 * 结构: 图g用邻接矩阵表示,最短路径长dist用数组表示。 * 算法:Dijkstra算法 * 复杂度:O(|V|^2) */ //HDU1874 #include<iostream> #include <iterator> #include<vector> using namespace std; int n;//顶点 vector<vector<int> > g; //路径权值 int s;//源点 vector<bool> known ; //是否已求得该点最短路径 vector<int> dist; //该点到源点s 的距离 vector<int> pre; // 该点最短路径的前一个点 void Dijkstra() { known.assign(n,false); dist.assign(n,INT_MAX); //pre.resize(n); dist[s]=0; //源点到本身距离为0 while(1){ int mmin=INT_MAX,v=s; for(int i=0;i<n;++i) //假设该点为终点,求出该点最短路径 if(!known[i]&&mmin>dist[i]) mmin=dist[i],v=i; known[v]=true; if(mmin==INT_MAX) break; //known全部为true了,即全面找到了最短路径 for(int w=0;w<n;++w) if(!known[w]&&g[v][w]<INT_MAX&&dist[w]>dist[v]+g[v][w]) dist[w]=dist[v]+g[v][w]; } } int main() { int m, i, a, b, x; while (cin>>n>>m) { g.assign(n,vector<int>(n,INT_MAX)); for (i=0; i<m; i++) { cin>>a>>b>>x; if(g[a][b]>x) //注意!! g[a][b]=g[b][a]=x; } cin>>s>>b; Dijkstra(); if (dist[b] == INT_MAX) cout<<"-1"<<endl; else cout<<dist[b]<<endl; } return 0; }