http://ybt.ssoier.cn:8088/problem_show.php?pid=1381
方法一:邻接矩阵存图写法
#include<cstdio> #include<cstring> #define inf 0x3f3f3f3f int m, n; int a, b, c; int g[2005][2005]; int dis[2005], vis[2005]; inline int read() { int x=0, f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();} while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();} return x*f; } void dijs(int s) { for(int i=1; i<=n; i++)dis[i]=g[s][i]; dis[s]=0; vis[s]=1; for(int i=1; i<n; i++) { int mindis=inf, temp; for(int j=1; j<=n; j++) { if(vis[j]==0&&dis[j]<mindis) { mindis=dis[j]; temp=j; } } vis[temp]=1; for(int j=1; j<=n; j++) { if(dis[j]>dis[temp]+g[temp][j]) dis[j]=dis[temp]+g[temp][j]; } } } int main() { n=read(); m=read(); memset(g, inf, sizeof(g)); for(int i=1; i<=n; i++)g[i][i]=0; for(int i=1; i<=m; i++) { a=read(); b=read(); c=read(); if(g[a][b]>c) g[a][b]=g[b][a]=c; //注意无向图存储两次 } dijs(1); if(dis[n]==inf)printf("-1"); else printf("%d",dis[n]); return 0; }
方法二:邻接表(vector)存图写法
#include<cstdio> #include<cstring> #include<vector> using namespace std; #define inf 0x3f3f3f3f int m, n; int s, t, d; int dis[200005], vis[200005]; inline int read() { int x=0, f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-')f=-1; ch=getchar();} while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();} return x*f; } struct node{ int u;int v; int w; }E; vector <node> edge[400005]; void dijs(int s) { memset(dis, 0x3f, sizeof(dis)); for(int j=0; j<edge[s].size(); j++) { E=edge[s][j]; if(dis[E.v]>E.w)dis[E.v]=E.w;//多条边存储最短 } dis[s]=0;vis[s]=1; //for(int i=1; i<=n; i++)printf("%d ",dis[i]); for(int i=1; i<n; i++) { int mindis=inf, mins; for(int j=1; j<=n; j++) { if(vis[j]==0 && dis[j]<mindis) { mindis=dis[j]; mins=j; } } vis[mins]=1; for(int j=0; j<edge[mins].size(); j++)//此处要比邻接矩阵快,时间复杂度为m { E=edge[mins][j]; if(dis[E.v]>dis[mins]+E.w && vis[E.v]==0)//此处vis[E.v]必须写,容易忘掉 dis[E.v]=dis[mins]+E.w; } } } int main() { n=read(); m=read(); for(int i=1; i<=m; i++) { s=read();t=read();d=read(); E.v=t;E.w=d; edge[s].push_back(E); E.v=s;E.w=d; edge[t].push_back(E); //注意此处无向图存两遍 } // for(int i=1; i<=n; i++) // { // for(int j=0; j<edge[i].size(); j++) // { // E=edge[i][j]; // printf("%d-%d=%d ",i,E.v,E.w); // } // // } dijs(1); printf("%d",dis[n]); return 0; }