• 观光旅游


    观光旅游

    时间限制: 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 } 
    View Code
    
    
  • 相关阅读:
    微软MSBI商业智能视频
    华为HG8245 电信 光猫破解获取超级密码
    Html5与CSS3权威指南 百度云下载
    GUI常用对象介绍3
    GUI常用对象介绍2
    GUI常用对象的属性
    AtCoder Beginner Contest 082 B
    AtCoder Beginner Contest 082 A
    回文字符串
    进制转换(大数)
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6953582.html
Copyright © 2020-2023  润新知