您的位置:首页 > 其它

Dijkstra 单源最短路径

2015-04-25 20:27 330 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: