题意啊,题意很重要!!N<100 而C<1000
第一个名字是拖车公司,后面的c个是破车的地方,所以有可能出现几个破车在同一个地方的。
而拖车一次只能拖一辆,所以要用一个数组记录下每个破车的位置。
就因为这,RE了我N次!
建图过程也挺麻烦,主要是字符串的处理
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
#include<cstring>
using namespace std;
map<string,int> m;
int main()
{
int i,j,n,broke,k,ans,cases=1;
int map[110][110];
int dis[110][110];
int c,r;
int id=1;
int q[1010];
string s,s1,s2,s3;
while(scanf("%d%d%d",&n,&c,&r)!=EOF)
{
m.clear();
broke=c;
id=1;
if(n==0&&c==0&&r==0) break;
memset(dis,0x3f,sizeof(dis));
memset(map,0x3f,sizeof(map));
for(i=1;i<=c+1;i++)
{
cin>>s;
if(m[s]==0) m[s]=id++;
int t=m[s];
q[i]=t; //记录破车;
}
for(i=1;i<=r;i++)
{
int a=0,b=0,sum=0;
cin>>s1>>s2>>s3;
if(m[s1]==0)
m[s1]=id++;
if(m[s3]==0)
m[s3]=id++;
// cout<<"\nm["<<s3<<"]="<<m[s3]<<" \n";
a=m[s1];
b=m[s3];
for(j=2;s2[j]!='-';j++)
{
sum=sum*10+s2[j]-'0';
}
if(s2[0]=='<')
{
if(sum<map[b][a])
map[b][a]=sum;
}
if(s2[s2.length()-1]=='>')
{
if(sum<map[a][b])
map[a][b]=sum;
}
}
//floyd算法
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
dis[i][j]=map[i][j];
dis[i][i]=0;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=dis[i][j]>dis[i][k]+dis[k][j]?dis[i][k]+dis[k][j]:dis[i][j];
ans=0;
for(i=2;i<=broke+1;i++)
ans+=dis[1][q[i]]+dis[q[i]][1];
printf("%d. %d\n",cases++,ans);
}
return 0;
}