题意:求修理破车花费的最短时间。
注意:有可能几台破车同时在一个城市
说好了n个城市,那么n个城市一定都会给有
破车有可能就在公司所在的那个城市
#include<iostream>
#include<cstdio>
#include<map>
#include<string.h>
#define maxint 10000000
using namespace std;
int n,c,r;
int ma[110][110];
map<string,int>Map;
void floyd()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(ma[i][j]>ma[i][k]+ma[k][j])
ma[i][j]=ma[i][k]+ma[k][j];
}
int main()
{
int t=0;
string ans[1100];
while(scanf("%d%d%d",&n,&c,&r)!=EOF)
{
if(n==0&&c==0&&r==0)
break;
t++;
Map.clear();
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
ma[i][j]=ma[j][i]=maxint;
if(i==j)
ma[i][j]=0;
}
int m=0;
for(int i=0; i<=c; i++)
{
cin>>ans[i];
if(!Map[ans[i]])
Map[ans[i]]=++m;
}
string a,b,cc;
for(int i=0; i<r; i++)
{
int tem=0;
int f1=0,f2=0;
cin>>a>>b>>cc;
if(!Map[a])
Map[a]=++m;
if(!Map[cc])
Map[cc]=++m;
if(b[0]=='<')
f1=1;
if(b[b.size()-1]=='>')
f2=1;
for(int j=0; j<b.size(); j++)
{
if(b[j]>='0'&&b[j]<='9')
tem=(b[j]-'0'+tem)*10;
}
if(f1==1&&tem/10<ma[Map[a]][Map[cc]])
ma[Map[a]][Map[cc]]=tem/10;
if(f2==1&&tem/10<ma[Map[cc]][Map[a]])
ma[Map[cc]][Map[a]]=tem/10;
}
floyd();
int sum=0,ii;
for(ii=1; ii<=c; ii++)
{
sum+=ma[Map[ans[0]]][Map[ans[ii]]];
sum+=ma[Map[ans[ii]]][Map[ans[0]]];
}
printf("%d. %d\n",t,sum);
}
return 0;
}
/*
4 2 5
NewTroy Midvale Metrodale
NewTroy <-20-> Midvale
Midvale --50-> Bakerline
NewTroy <-5-- Bakerline
Metrodale <-30-> NewTroy
Metrodale --5-> Bakerline
0 0 0
*/