Dijkstra算法模板

来源:互联网 发布:淘宝如何做展现词 编辑:程序博客网 时间:2024/05/18 06:04

运用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;} /*测试数据15 61 3 11 2 42 3 42 4 22 5 13 5 10结果:2147483647 4 1 6 5 */


原创粉丝点击