坑点:
1、要按双向边做
2、要记得处理出发点和终点相同的情况,直接输出0
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int MAXN=162;
const int INF=0x3F3F3F3F;
void work(int t)
{
int f[MAXN][MAXN];
int i,j,k,n,x,y,l;
string st,en;
map <string,int> num;
num.clear();
memset(f,0x3F,sizeof(f));
for(i=0;i<MAXN;i++) f[i][i]=0;
n=0;
cin>>st>>en;
num[st]=++n;
if(num.count(en))
{
cout<<0<<endl;
while(t--) cin>>st>>en>>l;;
return ;
}
else num[en]=++n;
while(t--)
{
cin>>st>>en>>l;
if(num.count(st))
x=num[st];
else
{
num[st]=++n;
x=n;
}
if(num.count(en))
y=num[en];
else
{
num[en]=++n;
y=n;
}
if(f[x][y]>l)
f[x][y]=f[y][x]=l;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
if(f[1][2]>=1500005) cout<<-1<<endl;
else cout<<f[1][2]<<endl;
}
int main()
{
int n;
while(scanf("%d",&n),n!=-1)
work(n);
return 0;
}
本文探讨了在图论中应用最短路径算法的原理与实践,包括如何解决出发点与终点相同的问题,并提供了算法的具体实现步骤。
701

被折叠的 条评论
为什么被折叠?



