标签:图
1.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <climits>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#define INF 100000000
using 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 100000000
using 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;
}
标签:图
原文地址:http://blog.csdn.net/qq_24667639/article/details/45273887