第一次的最短路,还可以吧!经过别人的提醒2A.
题目链接:点击打开链接
#include<cstdio> #include<cstring> using namespace std; const int N=205; const int INF=0xffffff; int Map[N][N]; int n,m,dis[N]; bool vis[N]; void Init() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) Map[i][j]=INF; } void dijkstra(int u) { //首先得初始化. memset(vis,0,sizeof(vis)); vis[u]=true; for(int i=0;i<n;i++) { if(i!=u) dis[i]=Map[u][i]; else dis[i]=0; } for(int i=0;i<n;i++) { int temp=INF,t=u; for(int j=0;j<n;j++) if(!vis[j]&&(dis[j]<temp)) {temp=dis[j];t=j;} // printf("temp=%d\n",temp); // printf("-------------\n"); if(t==u) break; vis[t]=true; for(int j=0;j<n;j++) if(!vis[j]&&Map[t][j]<INF&&dis[j]>(dis[t]+Map[t][j])) dis[j]=dis[t]+Map[t][j]; } } int main() { while(~scanf("%d%d",&n,&m)) { Init(); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(Map[a][b]>c) { Map[a][b]=c; Map[b][a]=c; } } int u,end; scanf("%d%d",&u,&end); dijkstra(u); if(dis[end]==INF) printf("-1\n"); else printf("%d\n",dis[end]); } return 0; }