普通dijkstra(鄰接矩陣)
阿新 • • 發佈:2019-02-19
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #define inf 999999999 #define maxn 20005 using namespace std; int g[maxn][maxn]; int dist[maxn]; int vis[maxn]; int n,m; void dijkstra(int st){ int i,j,mindis,u; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++){ dist[i]=g[st][i]; } vis[st]=1; for(i=1;i<=n;i++){ mindis=inf; u=-1; for(j=1;j<=n;j++){ if(!vis[j]&&mindis>dist[j]){ mindis=dist[j]; u=j; } } if(u==-1)break; vis[u]=1; for(j=1;j<=n;j++){ if(!vis[j]&&dist[j]>dist[u]+g[u][j]){ dist[j]=dist[u]+g[u][j]; } } } } int main(){ int i,j,t; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j)g[i][j]=0; else g[i][j]=inf; } dist[i]=inf; } for(i=0;i<m;i++){ int a,b,x; scanf("%d%d%d",&a,&b,&x); a++;b++; if(g[a][b]>x)g[a][b]=g[b][a]=x; } int u,v; scanf("%d%d",&u,&v); u++;v++; dijkstra(u); if(dist[v]==inf)printf("-1\n"); else printf("%d\n",dist[v]); } return 0; } /* 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2 */ /* 2 -1 */