您的位置:首页 > 其它

hdu 2923 map+Floyd 拉破车

2015-06-21 00:51 381 查看

有向图 具体方向看箭头 从起点到指定城市拉破车,一个城市可能有多个破车,一次只能拉一辆破车 也就是到了指定地点后要回到起点

假如有100辆破车 但是只有一个城市有 就得在起点与这个城市间往返100次
所以要用s1记录

然后 貌似这题是有重边的....
sscanf(s4,"%d" ,&w) ; 这个是错的=.= 在这折腾了半天

Sample Input
4 2 5 //城市数 破车数 边数
NewTroy Midvale Metrodale //起点 + 有破车的城市
NewTroy <-20-> Midvale
Midvale --50-> Bakerline
NewTroy <-5-- Bakerline
Metrodale <-30-> NewTroy
Metrodale --5-> Bakerline
0 0 0

Sample Output
1. 80 //Case.  sum

 

# include <iostream>
# include <cstdio>
# include <cstring>
# include <string>
# include <algorithm>
# include <cmath>
# include <map>
# define LL long long
using namespace std ;

const int MAXN = 110 ;
const int INF = 0x3f3f3f3f;
int dis[MAXN][MAXN];
int n ;
map<string,int> mp ;

void floyed()//节点从1~n编号
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dis[i][k]+dis[k][j] < dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];

}

int main()
{
// freopen("in.txt","r",stdin) ;
int m , c ;
int Case = 0;
while (cin>>n>>c>>m)
{
if (n == 0 && c == 0 && m == 0)
break ;
Case++ ;
int i , j ;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)dis[i][j]=0;
else dis[i][j]=INF;
}
mp.clear() ;
string s1[1100] ,s2,s3;
int l = 1 ;
for (i = 0 ; i <= c ; i++) //起点+ 有破车的城市
{
cin>>s1[i] ;
if (!mp[s1[i]])
mp[s1[i]] = l++ ;
}
char s4[20] ;

int w ;
while(m--)
{
cin>>s2>>s4>>s3 ;
bool f1 = 0 ;
bool f2 = 0 ;
if (!mp[s2])
mp[s2] = l++ ;
if (!mp[s3])
mp[s3] = l++ ;
int len = strlen(s4) ;
if (s4[0] == '<')
f1 = 1 ;
if (s4[len-1] == '>')
f2 = 1 ;
sscanf(&s4[2],"%d" ,&w) ;
if (f1 && w < dis[mp[s3]][mp[s2]])
dis[mp[s3]][mp[s2]] = w ;
if (f2 && w < dis[mp[s2]][mp[s3]])
dis[mp[s2]][mp[s3]] = w ;
}
floyed() ;
int sum = 0 ;
for (i = 1 ; i <= c ; i++)
{
sum += dis[mp[s1[0]]][mp[s1[i]]] ;
sum += dis[mp[s1[i]]][mp[s1[0]]] ;
}
cout<<Case<<". "<<sum<<endl ;

}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: