hdu 2923 Einbahnstrasse

/*
	题目大意是:某个城市有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;
}

 

你可能感兴趣的:(c)