首页 > 代码库 > Codevs 2611 观光旅游
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++)// Floyed25 {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 }
最小环 ~背模板
Codevs 2611 观光旅游
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。