Einbahnstrasse(Floyd)
原题:hdu2923
这个是一个很明显的Floyd最短路径题,就是把字符串转化成对应的数字比较麻烦,我一开始用string保存地名,后来发现cin>>string;会忽视回车键,所以建议此题还是用map<string,int>和char数组来做简单一点。
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
int n,c,r,j,s;
int cl[1050],mp[150][150];
int ma=100000000;
char str[1050][25];
char str1,str2;
map<string,int>maps;
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(mp[i][k]<ma)
{
for(int l=1;l<=n;l++)
{
if(mp[k][l]<ma&&mp[i][l]>mp[i][k]+mp[k][l])
{
mp[i][l]=mp[i][k]+mp[k][l];
}
}
}
}
}
}
int main()
{
int gs=0;
while(scanf("%d%d%d",&n,&c,&r)!=EOF&&(n||c||r))
{
gs++;
maps.clear();
for(int i=1;i<=n;i++)
{
for(int l=1;l<=n;l++)
{
if(i==l)
{
mp[i][l]=0;
}
else
{
mp[i][l]=ma;
}
}
}
j=1;
char s1[25],s2[25];
for(int i=0;i<=c;i++)
{
scanf("%s",str[i]);
}
int beg,ed,t;
for(int i=0;i<r;i++)
{
scanf("%s %c-%d-%c %s",s1,&str1,&t,&str2,s2);
if(!maps[s1])
{
maps[s1] = j++;
}
if(!maps[s2])
{
maps[s2] = j++;
}
beg=maps[s1];
ed=maps[s2];
if(str2=='>')
{
if(mp[beg][ed]>t)
{
mp[beg][ed]=t;
}
}
if(str1=='<')
{
if(mp[ed][beg]>t)
{
mp[ed][beg]=t;
}
}
}
floyd();
int cost=0;
s=maps[str[0]];
for(int i=1;i<=c;i++)
{
cost+=mp[s][maps[str[i]]]+mp[maps[str[i]]][s];
}
printf("%d. %d\n",gs,cost);
}
return 0;
}