不想用floyd了 也不一定适合 floyd只能处理小数据
dijkstra算法
wa了很久 一个是dijkstra里面的u 导致RE了无数次 下标溢出
还有就是注意细节 当起点和终点是一个地方的时候 输出0
#include<iostream> #include<map> #include<cstdio> #include<cstring> #include<string> using namespace std; #define INF 99999999 int m1[155][155]; map<string,long long>ma; int dis[155]; int vis[155];int c; void di() { memset(vis,0,sizeof(vis)); for(int i=1;i<=c;i++) dis[i]=m1[1][i]; vis[1]=1; for(int i=0;i<c-1;i++) { int minn=INF; int u; for(int j=1;j<=c;j++) { if(vis[j]==0&&dis[j]<minn) { u=j; minn=dis[j]; } } vis[u]=1; for(int j=1;j<=c;j++) { if(vis[j]==0&&dis[u]+m1[u][j]<dis[j]) { dis[j]=dis[u]+m1[u][j]; } } } } int main() { int n; while(scanf("%d",&n)==1&&n!=-1) { c=0; ma.clear(); string s1,s2; int ok=1; cin>>s1>>s2;if(s1==s2){ok=0;} ma[s1]=++c; ma[s2]=++c; int time1; for(int i=0;i<=153;i++) for(int j=0;j<=153;j++) { if(i==j)m1[i][j]=0; else m1[i][j]=INF; } while(n--) { cin>>s1>>s2>>time1; if(ma[s1]==0)ma[s1]=++c; if(ma[s2]==0)ma[s2]=++c; if(time1<m1[ ma[s1] ][ ma[s2] ]) { m1[ ma[s1] ][ ma[s2] ]=m1[ ma[s2] ][ ma[s1] ]=time1; } } di(); if(!ok)printf("0\n"); else { if(dis[2]!=INF) printf("%d\n",dis[2]); else printf("-1\n"); } } return 0; }
原文地址:https://www.cnblogs.com/bxd123/p/10326388.html
时间: 2024-11-05 19:35:11