hdu2923

题意:求修理破车花费的最短时间。
注意:有可能几台破车同时在一个城市
说好了n个城市,那么n个城市一定都会给有
破车有可能就在公司所在的那个城市
#include<iostream>
#include<cstdio>
#include<map>
#include<string.h>
#define maxint 10000000
using namespace std;
int n,c,r;
int ma[110][110];
map<string,int>Map;
void floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(ma[i][j]>ma[i][k]+ma[k][j])
                    ma[i][j]=ma[i][k]+ma[k][j];
}
int main()
{
    int t=0;
    string ans[1100];
    while(scanf("%d%d%d",&n,&c,&r)!=EOF)
    {
        if(n==0&&c==0&&r==0)
         break;
        t++;
        Map.clear();
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                ma[i][j]=ma[j][i]=maxint;
                if(i==j)
                 ma[i][j]=0;
            }
        int m=0;
        for(int i=0; i<=c; i++)
        {
            cin>>ans[i];
            if(!Map[ans[i]])
              Map[ans[i]]=++m;
        }
        string a,b,cc;
        for(int i=0; i<r; i++)
        {
            int tem=0;
            int f1=0,f2=0;
            cin>>a>>b>>cc;
            if(!Map[a])
                Map[a]=++m;
            if(!Map[cc])
                Map[cc]=++m;
            if(b[0]=='<')
                f1=1;
            if(b[b.size()-1]=='>')
                f2=1;
            for(int j=0; j<b.size(); j++)
            {

                if(b[j]>='0'&&b[j]<='9')
                    tem=(b[j]-'0'+tem)*10;
            }
            if(f1==1&&tem/10<ma[Map[a]][Map[cc]])
                ma[Map[a]][Map[cc]]=tem/10;
            if(f2==1&&tem/10<ma[Map[cc]][Map[a]])
                ma[Map[cc]][Map[a]]=tem/10;
        }
        floyd();
        int sum=0,ii;
        for(ii=1; ii<=c; ii++)
        {
            sum+=ma[Map[ans[0]]][Map[ans[ii]]];
            sum+=ma[Map[ans[ii]]][Map[ans[0]]];
        }
        printf("%d. %d\n",t,sum);
    }
    return 0;
}
/*
4 2 5
NewTroy Midvale Metrodale
NewTroy   <-20-> Midvale
Midvale   --50-> Bakerline
NewTroy    <-5-- Bakerline
Metrodale <-30-> NewTroy
Metrodale  --5-> Bakerline
0 0 0
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值