Dijkstra算法模板

运用C++STL中list储存图,算法详细介绍在另一篇文章中

#include<iostream>
#include<cstring>
#include<list>
#include<climits>
using namespace std;
const int M=10000;
struct edge{
	int to;
	int weight;
};
list<edge>edges[M];
void addEdge(int x,int y,int z){
	edges[x].push_back((edge){y,z});
}
void Dijkstra(int s,int n){
	int vis[M],dis[M];
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)dis[i]=INT_MAX;
	for(list<edge>::iterator it=edges[1].begin();it!=edges[1].end();it++){
		dis[it->to]=it->weight;
	}
	vis[s]=-1;
	for(int i=1;i<=n;i++)printf("%d ",dis[i]);
	printf("\n");
	for(int i=1;i<=n-1;i++){
		int Min=INT_MAX,u=-1;
		for(int w=1;w<=n;w++)if(vis[w]!=-1){
			if(dis[w]<Min)Min=dis[w],u=w;
		}
		if(u!=-1){
			vis[u]=-1;
			for(list<edge>::iterator it=edges[u].begin();it!=edges[u].end();it++)if(vis[it->to]!=-1){
				if(dis[it->to]>(it->weight+dis[u]))dis[it->to]=(it->weight+dis[u]);
			}
		}
	}
	for(int i=1;i<=n;i++)printf("%d ",dis[i]);
	printf("\n");
	return;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,s;
		cin>>n>>s;
		for(int i=0;i<s;i++){
			int a,b,c;
			cin>>a>>b>>c;
			addEdge(a,b,c);
			addEdge(b,a,c);
		}
		Dijkstra(1,n);
	}
	return 0;
} 
/*测试数据
1
5 6
1 3 1
1 2 4
2 3 4
2 4 2
2 5 1
3 5 10
结果:2147483647 4 1 6 5 
*/


posted @ 2017-10-12 20:11  琳小羽  阅读(137)  评论(0)    收藏  举报