标签:... 分享 push ace ack min open 处理 style
tips:
1.用了Dijsktra算法,邻接表存图,单源最短路,无负权图
2.对n个顶点进行处理分成两个集合,松弛n次(也是循环次数)
3.学习优化后的Dijsktra...ヾ(?°?°?)??
#include<cstdio> #include<vector> using namespace std; int n,m; const int M=110; const int inf=0x3f3f3f3f; struct node{ int v; int w; node(int _v,int _w) : v(_v),w(_w){} }; vector<node>G[M]; int d[M]; bool vis[M]; void Dikstra(){ for(int i=1;i<=n;i++){ d[i]=inf; } fill(vis,vis+M,0); d[1]=0; for(int i=0;i<n;i++){ int u=-1;int Min=inf; for(int i=1;i<=n;i++){ if(vis[i]== false && d[i]<Min){ u=i; Min=d[i]; } } if(u == -1) return ; vis[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i].v; int w=G[u][i].w; if(vis[v]== false && d[v]>d[u]+w) d[v]=d[u]+w; } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ if(n==0 && m==0) break; int x,y,z; for(int i=0;i<m;i++){ scanf("%d%d%d",&x,&y,&z); G[x].push_back(node(y,z)); G[y].push_back(node(x,z)); } Dikstra(); printf("%d\n",d[n]); for(int i=1;i<=n;i++){ G[i].clear(); } } return 0; }
标签:... 分享 push ace ack min open 处理 style
原文地址:https://www.cnblogs.com/SUMaywlx/p/9439959.html