Dijkstra 单源最短路径

来源:互联网 发布:硕士论文淘宝代写 编辑:程序博客网 时间:2024/05/21 10:33
1.#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <climits>#include <cstring>#include <cmath>#include <map>#include <set>#define INF 100000000using namespace std;int n,v,m;int d[1000];int vis[1000];int G[1000][1000]; int dijkstra(int s){fill(d,d+n,INF);memset(vis,0,sizeof(vis));d[s] = 0;for(int i = 0;i < n - 1;i++){int tm = INF;int q ;//在已经寻找到最短路径的点找到最小的那个 for(int j = 0;j < n;j++){if(!vis[j] && d[j] < tm){tm = d[j];q = j;}}//代表这个点已经找到了最短路径vis[q] = 1; for(int j = 0;j < n;j++){if(G[q][j]){d[j] = min(d[j],d[q] + G[q][j]);}} }for(int i = 0;i < n;i++){printf("%d\n",d[i]);}} int main(){while(cin >> n >> m){for(int i = 0;i < m;i++){int x,y,w;cin >> x >> y >> w;G[x][y] = w;G[y][x] = w;}int s;cin >> s;dijkstra(s);}return 0;}

2.

#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <climits>#include <cstring>#include <cmath>#include <map>#include <set>#define INF 100000000using namespace std;int n,v,m;int d[1000];int vis[1000];int G[1000][1000];typedef pair<int,int> pa;int dijkstra(int s){fill(d,d+n,INF);memset(vis,0,sizeof(vis));priority_queue< pa,vector<pa>,greater<pa> > que;que.push(pa(0,s));d[s] = 0;for(int i = 0;i < n - 1;i++){int q = que.top().second;que.pop();for(int j = 0;j < n;j++){if(G[q][j]){d[j] = min(d[j],d[q] + G[q][j]);que.push(pa(d[j],j));}} }for(int i = 0;i < n;i++){printf("%d\n",d[i]);}} int main(){while(cin >> n >> m){for(int i = 0;i < m;i++){int x,y,w;cin >> x >> y >> w;G[x][y] = w;G[y][x] = w;}int s;cin >> s;dijkstra(s);}return 0;}


0 0