Codevs 2611 观光旅游

  

 时间限制: 1 s  空间限制: 128000 KB  题目等级:钻石
 
题目描述 Description

某旅游区里面有N个景点。两个景点之间可能直接有道路相连,用a[i][j]表示它的长度,否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从i到j有直接的道路,那么从j到i也有,并且长度与之相等。

旅游区规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Smart决定到这个景区来旅游,由于他实在已经很累了,于是他决定尽量少走一些路。

他想请你帮他求出最优的路线。怎么样,不是很难吧?

输入描述 Input Description

输入有多组数据。对于每组数据:

第一行有两个正整数N,M,分别表示景点个数和有多少对景点之间直接有边相连(N≤100,M≤10000);

接下来M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度(长度≤1000)。

输出描述 Output Description

对于每组数据,输出一行,如果该回路存在,则输出一个正整数,表示该回路的总长度;否则输出“No solution.”(不要输出引号)

样例输入 Sample Input

5 7

1 4 1

1 3 300

3 1 10

1 2 16

2 3 100

2 5 15

5 3 20

4 3

1 2 10

1 3 20

1 4 30

样例输出 Sample Output

61

No solution.

数据范围及提示 Data Size & Hint

N≤100,M≤10000

长度≤1000

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define INF 100000000
 5 using namespace std;
 6 int n,m;
 7 int map[1000][1000],dis[1000][1000];
 8 int main()
 9 {
10     while((scanf("%d%d",&n,&m))==2)
11     {
12         for(int i=1;i<=n;i++)
13           for(int j=1;j<=n;j++)
14             map[i][j]=INF,dis[i][j]=INF;
15         for(int i=1;i<=m;i++)
16         {
17             int x,y,z;
18             cin>>x>>y>>z;
19             if(map[x][y]>z)
20               map[x][y]=map[y][x]=z,dis[x][y]=dis[y][x]=z;
21         }
22         
23         int minn=INF;
24         for(int k=1;k<=n;k++)// Floyed
25         {
26             for(int i=1;i<=k-1;i++)
27               for(int j=i+1;j<=k-1;j++)
28                 minn=min(minn,dis[i][j]+map[j][k]+map[k][i]);
29             for(int i=1;i<=n;i++)
30                 for(int j=1;j<=n;j++)
31                     if(dis[i][j]>dis[i][k]+dis[k][j])
32                       dis[i][j]=dis[i][k]+dis[k][j];
33         }
34         if(minn!=INF)
35           printf("%d\n",minn);
36         else printf("No solution.\n");
37     }
38     return 0;
39 }
View Code

最小环 ~背模板

posted @ 2016-09-25 09:00  浮华的终成空  阅读(114)  评论(0编辑  收藏  举报

Contact with me