一个城市,有单向路和双向路,某些地点车辆发生故障,报告进行维修。按照报告顺序用拖车把车一辆一辆从事故地点运回修理站,问拖车总共行驶了多少路程。
题目是简单的,flody算法直接暴力。题目中要求按顺序,其实没关系的。不过理解到是一辆一辆运倒是花了不少时间。题目输出有特殊要求,要注意,同时还要注意有重边。
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iostream>
using namespace std;
const int inf=1<<20;
int N,C,R;
int mm[105][105];
int car[105];
map <string,int> spot;
void init(){
spot.clear();
memset(car,0,sizeof(car));
for(int i=0;i<=N;i++){
for(int j=i+1;j<=N;j++){
mm[i][j]=mm[j][i]=inf;
}
}
}
void floyd(){
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
if(mm[i][k]==inf) continue;
for(int j=1;j<=N;j++){
if(i!=j && i!=k && j!=k && mm[i][j]>mm[i][k]+mm[k][j]){
mm[i][j]=mm[i][k]+mm[k][j];
}
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
int i=1;
while(cin >> N >> C >> R){
if(!N && !C && !R) break;
init();
int z=1;
for(int a=0;a<=C;a++){
char temp[15];
scanf("%s",temp);
if(!spot[temp]) spot[temp]=z++;
car[spot[temp]]++;
}
car[C+1]=1;
while(R--){
char s1[15],s2[15];
bool flag1=0,flag2=0;
int v;
scanf("%s",s1);
char tt;
do{
tt=getchar();
}while(tt==' ');
if(tt=='<') flag1=1;
getchar();
scanf("%d",&v);
getchar();
tt=getchar();
if(tt=='>') flag2=1;
scanf("%s",s2);
if(!spot[s1]) spot[s1]=z++;
if(!spot[s2]) spot[s2]=z++;
if(flag1 && mm[spot[s2]][spot[s1]]>v) mm[spot[s2]][spot[s1]]=v;
if(flag2 && mm[spot[s1]][spot[s2]]>v) mm[spot[s1]][spot[s2]]=v;
}
floyd();
int ans=0;
for(int x=2;x<=N;x++){
if(car[x]) ans+=(mm[1][x]+mm[x][1])*car[x];
}
printf("%d. %d\n",i,ans);
i++;
}
return 0;
}