观光旅游
时间限制: 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. "); 45 else printf("%d ",ans); 46 } 47 }