观光旅游

观光旅游

时间限制: 1 Sec  内存限制: 128 MB
提交: 49  解决: 25
[提交][状态][讨论版]

题目描述

  学校里面有N个景点。两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度;否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从I到J有直接的道路,那么从J到I也有,并且长度与之相等。学校规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Xiaomengxian决定到湖南师大附中旅游。由于他实在已经很累了,于是他决定尽量少走一些路。于是他想请你——一个优秀的程序员——帮他求出最优的路线。怎么样,不是很难吧?(摘自《郁闷的出纳员》)

输入

输入中有多组数据。请用SeekEof判断是否到达文件结束。 对于每组数据: 第一行有两个正整数N,M,分别表示学校的景点个数和有多少对景点之间直接有边相连。(N< =100,M< =10000) 以下M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度。

输出

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

样例输入

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

样例输出

61
No solution.

题解:这是一道最小环的题,用floyd来跑,就是从较小的路确定后,枚举较大的路,i,j一条路在它们之间确定,另一条枚举>i,j的中转点来产生。
 1 #include<cstdio> 
 2 #include<algorithm> 
 3 #include<iostream> 
 4 #include<cmath> 
 5 #include<cstring> 
 6 #include<string> 
 7   
 8 using namespace std; 
 9 const int MAXN=107; 
10 const int MM=1e6+7; 
11   
12 int a[MAXN][MAXN],dis[MAXN][MAXN]; 
13 int n,m,ans; 
14   
15 void floyd() 
16 { 
17     for (int k=1;k<=n;k++) 
18     { 
19         for (int i=1;i<k-1;i++) 
20             for (int j=i+1;j<=k-1;j++) 
21                 ans=min(ans,a[i][k]+a[k][j]+dis[i][j]); 
22         for (int i=1;i<=n;i++) 
23             for (int j=1;j<=n;j++) 
24                 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);            
25     } 
26 } 
27 int main() 
28 { 
29     while (~scanf("%d%d",&n,&m)) 
30     { 
31         for (int i=1;i<=n;i++) 
32             for (int j=1;j<=n;j++) 
33                 a[i][j]=dis[i][j]=MM; 
34         int x,y,z; 
35         for (int i=1;i<=m;i++) 
36         { 
37             scanf("%d%d%d",&x,&y,&z); 
38             a[x][y]=dis[x][y]=a[y][x]=dis[y][x]=z; 
39         } 
40           
41         ans=MM;      
42         floyd(); 
43           
44         if (ans==MM) printf("No solution.\n"); 
45         else printf("%d\n",ans); 
46     } 
47 } 
View Code

 


posted @ 2017-06-06 20:53  Kaiser-  阅读(137)  评论(0编辑  收藏  举报