Hdu--2923(图论,最短路,map建图)

2014-09-11 22:42:28

题目链接

思路:用这题熟悉了下map,建好图后就是裸地Floyd,WA 3发,最后发现是自己二货地想:拖车把所有车拖着一起返回garage。。。。QAQ,应该一辆一辆拖啊骚年。

 1 /*************************************************************************
 2     > File Name: 2923.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com
 5     > Created Time: Thu 11 Sep 2014 09:26:08 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <string>
15 #include <map>
16 #include <iostream>
17 #include <algorithm>
18 using namespace std;
19 typedef long long ll;
20 const int INF = 1 << 29;
21 
22 int Case,N,C,R,cnt,p;
23 int arr[1005],dis[105][105];
24 map<string,int> mp;
25 
26 void Floyd(){
27     for(int k = 1; k <= p; ++k)
28     for(int i = 1; i <= p; ++i)
29     for(int j = 1; j <= p; ++j) if(dis[i][k] < INF && dis[k][j] < INF){
30         dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
31     }
32 }
33 
34 void Init(){
35     mp.clear();
36     cnt = p = 0;
37     for(int i = 0; i < 105; ++i){
38         for(int j = 0; j < 105; ++j) dis[i][j] = INF;
39         dis[i][i] = 0;
40     }
41 }
42 
43 int main(){
44     string name,name2,tmp;
45     int a,b;
46     while(scanf("%d%d%d",&N,&C,&R) != EOF){
47         if(N == 0 && C == 0 && R == 0) break;
48         Init();
49         for(int i = 1; i <= C + 1; ++i){
50             cin >> name;
51             if(mp.find(name) == mp.end())
52                 mp[name] = ++p;
53             arr[++cnt] = mp[name];
54         }
55         arr[++cnt] = 1;
56         for(int i = 1; i <= R; ++i){
57             cin >> name >> tmp >> name2;
58             if(mp.find(name) == mp.end())
59                 mp[name] = ++p;
60             a = mp[name];
61             if(mp.find(name2) == mp.end())
62                 mp[name2] = ++p;
63             b = mp[name2];
64             int val = tmp[2] - '0',ind = 3;
65             while(tmp[ind] >= '0' && tmp[ind] <= '9'){
66                 val = val * 10 + tmp[ind] - '0';
67                 ind++;
68             }
69             if(tmp[0] == '<') dis[b][a] = min(dis[b][a],val);
70             if(tmp[tmp.size() - 1] == '>') dis[a][b] = min(dis[a][b],val);
71         }
72         Floyd();
73         int ans = 0;
74         for(int i = 2; i <= cnt; ++i){
75             ans += dis[1][arr[i]] + dis[arr[i]][1];
76         }
77         printf("%d. %d\n",++Case,ans);
78     }
79     return 0;
80 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/3967404.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值