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 }
最小环 ~背模板