hdu2923+floyd

也没啥好讲的。字符串模拟出图后直接floyd,水题+1。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<map>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 map<string,int> mmap;
 8 int n,c,r;
 9 int g[110][110];
10 const int mmax=10000005;
11 int main()
12 {
13     int i,j,d[1100],dnum,k,numcas=0;
14     while(scanf("%d%d%d",&n,&c,&r)!=EOF)
15     {
16         if(n==0&&c==0&&r==0) break;
17         for(i=0;i<n;i++)
18             for(j=0;j<n;j++)
19             g[i][j]=mmax;
20             for(i=0;i<n;i++)
21                 g[i][i]=0;
22         mmap.clear();
23         string str;
24         int cnt=0;
25         dnum=0;
26         for(i=0;i<c+1;i++)
27         {
28             cin>>str;
29             if(mmap.count(str)==0)
30                 mmap[str]=cnt++;
31             if(i!=0)
32                 d[dnum++]=mmap[str];
33         }
34         for(i=0;i<r;i++)
35         {
36             string city1,op,city2;
37             cin>>city1>>op>>city2;
38             if(mmap.count(city1)==0)
39                 mmap[city1]=cnt++;
40             if(mmap.count(city2)==0)
41                 mmap[city2]=cnt++;
42             int num1=mmap[city1];
43             int num2=mmap[city2];
44             int w=0;
45             for(j=2;;j++)
46             {
47                 if(op.at(j)>=‘0‘&&op.at(j)<=‘9‘)
48                     w=w*10+op.at(j)-‘0‘;
49                 else break;
50             }
51             if(op.at(0)==‘<‘)
52             {
53                 if(w<g[num2][num1])
54                     g[num2][num1]=w;
55             }
56             if(op.at(op.length()-1)==‘>‘)
57             {
58                 if(w<g[num1][num2])
59                     g[num1][num2]=w;
60             }
61         }
62         //以上构图
63         for(k=0;k<n;k++)
64             for(i=0;i<n;i++)
65               for(j=0;j<n;j++)
66               g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
67         int ans=0;
68         for(i=0;i<c;i++)
69             ans=ans+g[0][d[i]]+g[d[i]][0];
70         printf("%d. %d\n",++numcas,ans);
71     }
72     return 0;
73 }
时间: 2025-01-06 05:35:16

hdu2923+floyd的相关文章

HDU2923 Einbahnstrasse (Floyd)

Einbahnstrasse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3263    Accepted Submission(s): 1018 Problem Description Einbahnstra e (German for a one-way street) is a street on which vehicles

AtCoder Beginner Contest 074 D - Restoring Road Network(Floyd变形)

题目链接:点我点我 题意:给出一个最短路的图,询问是否正确,如果正确的话,输出遍历所有点的最短路径和. 题解:判断是否正确的,直接再一次Floyd,判断是否会有A[i][k]+A[k][j]<A[i][j](通过中间点k使得两点间距离更短),如果有的话,直接输出-1. 要遍历到所有道路,并且路径和最小,我们可以尽可能用用中间点的路径(A[i][k]+A[k][j]==A[i][j]),这样本来遍历两个点,就可以遍历3个点了, 最后加的时候记得不要从重复加,从最小点往后加,不要再往前加,不然就重复

floyd算法--一个人的旅行

2017-07-27 22:37:32 writer:pprp 题目如下: 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历, 还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信, 去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训

UVA104Arbitrage(floyd最短路)

UVA104Arbitrage 题目大意: 给你两两国家之间的汇率,要求你从任何一个国家出发,身上带着1(单位不明),然后回到这个国家时,身上的钱能够> 1.01.并且如果这样的路径有多条的话,希望的到的是最短的路径,并且还有要求你输出这个最短的路径. 解题思路: 利用floyd可以求出旅游任何两个国家的可以得到的最大的金钱,可是无法获得最短的路径,最短路径的意思是中转的国家数尽量少.因此需要再加上一维来标记国家i到j,中间经过了p个中间的国家到达(包括i).那么G[i][j][p] = max

Six Degrees of Cowvin Bacon (poj 2139 最短路Floyd)

Language: Default Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3288   Accepted: 1529 Description The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees

【最短路】求两点间最短路的Floyd算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P22 此代码返回第一个点和最后一个点之间最短路径,以及最短路径的长度. 代码如下: 1 function [P,u ] = Floyd(W) 2 %W表示权值矩阵 3 %P表示最短路径 4 %u表示最短路的权和 5 n=length(W); 6 U=W; 7 m=1; 8 9 while m<=n %判断是否满足停止条件 10 for i=1:n 11 for j=1:n 12 if U(i,j)>U(i,m)+U

POJ - 2253 Frogger(Floyd最短路+预处理)

题目链接:http://poj.org/problem?id=2253 题意:青蛙要从点1到点2,给出各点的坐标,如果点A到点B可以通过A->C,C->B,A到B的距离可以用A->C和C-B中较长的一边代替(如果A直接到B更短的话就不用了),求点1到点2的最短距离. 题解:本来想用dijkst,但是想想就200的数据量,直接Floyd岂不美滋滋.先预处理一下各点之间的距离.因为取两条边中较长的那条边,所以转移的话,那转移的两条边都要比原来的短才可以. 值得注意的是用C的格式输入的时候要用

Floyd算法 - 最短路径

2017-07-27 22:21:04 writer:pprp 该算法的本质是动态规划,形式简单,复杂度高为O(n^3): d[i][j] = max(d[i][k]+d[k][j],d[i][j]); 采用的基本手段是松弛 适用:解决多源最短路径问题 代码如下: #include <iostream> using namespace std; const int maxn = 200; int n,s,t; int a[maxn+1][maxn+1]; void init() { int m

hdu1874 畅通project续 最短路 floyd或dijkstra或spfa

Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择.而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点.请你计算出要从起点到终点,最短须要行走多少距离. Input 本题目包括多组数据,请处理到文件结束. 每组数据第一行包括两个正整数N和M(0< N<200,0 < M<1000),分别代表现有城镇的数目和已