/*
题目大意是:某个城市有n个路口,r条道路(有单向的和双向的),c辆车坏了,求一辆一辆地把坏车拖回来需要走多长的距离
因为是多源最短路(拖车公司和坏车的地点都作为源点)问题,用Floyd
*/
#include<stdio.h>
#include<string>
#include<string.h>
#include<map>
using namespace std;
int maze[110][110],xiu[1010];
map<string,int>name;
int n,c,r,s,no,num=1;
char nam1[30],nam2[30],fang[30];
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(maze[i][j]>maze[i][k]+maze[k][j])
maze[i][j]=maze[i][k]+maze[k][j];
}
int main()
{
int i,j,k;
while(scanf("%d%d%d",&n,&c,&r),n+c+r)
{
no=1;
getchar();
name.clear();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
maze[i][j]=(i!=j)*999999999;
scanf("%s",nam1);
name[nam1]=no++;
s=1;
for(i=1;i<=c;i++)
{
scanf("%s",nam1);
k=name[nam1];
if(!k)
{
k=no++;
name[nam1]=k;
}
xiu[i]=k;
}
for(i=1;i<=r;i++)
{
scanf("%s %s %s",nam1,fang,nam2);
int p,q,o;
p=name[nam1];
if(!p)
{
p=no++;
name[nam1]=k;
}
q=name[nam2];
if(!q)
{
q=no++;
name[nam2]=q;
}
sscanf(fang+2,"%d",&o);
if(fang[0]=='<')
{
if(maze[q][p]>o)//不知道为啥非得有这个判断;开始的时候都初始化过了;
//除非直接连接两路口的路不只一条,需要更新到最小值
maze[q][p]=o;
}
if(fang[strlen(fang)-1]=='>')
{
if(maze[p][q]>o)
maze[p][q]=o;
}
}
floyd();
int max=0;
for(i=1;i<=c;i++)
max+=(maze[s][xiu[i]]+maze[xiu[i]][s]);
printf("%d. %d\n",num++,max);
}
return 0;
}
hdu 2923 Einbahnstrasse
最新推荐文章于 2022-02-25 19:38:17 发布