zoukankan      html  css  js  c++  java
  • 观光旅游(floyed最小环)

    观光旅游

    题目描述:
    某旅游区里面有N个景点。两个景点之间可能直接有道路相连,用a[i][j]表示它的长度,否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从i到j有直接的道路,那么从j到i也有,并且长度与之相等。
    旅游区规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Smart决定到这个景区来旅游,由于他实在已经很累了,于是他决定尽量少走一些路。
    他想请你帮他求出最优的路线。怎么样,不是很难吧?
    输入描述:
    输入有多组数据。对于每组数据:
    第一行有两个正整数N,M,分别表示景点个数和有多少对景点之间直接有边相连(N≤100,M≤10000);
    接下来M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度(长度≤1000)。
    输出描述:
    对于每组数据,输出一行,如果该回路存在,则输出一个正整数,表示该回路的总长度;否则输出“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.
    数据范围及提示:
    N≤100,M≤10000
    长度≤1000

    证明:
    枚举一个环中的最大结点k(编号最大),与它相连的两个点为i,j,这个环的最短长度为e[i][k]+e[k][j]+map[i][j] (map[i][j]为i到j的最短路径长度)
    根据floyd的原理,在最外层循环做了k-1次之后,map[i][j]则代表了i到j的路径中,所有结点编号都小于k的最短路径
    综上所述,该算法一定能找到图中最小环。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int maxn=101;
    int n,m,map[maxn][maxn],e[maxn][maxn];
    int init()
    {
        int p=0,f=1;char c=getchar();
        while(c<'0'||c>'9')
        {if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9')
        {p=p*10+c-'0';c=getchar();}
        return p*f;
    }
    int main()
    {
        int x,y,z;
        while(cin>>n>>m)
        {
            int ans=9999999;
            for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
              if(i==j)
              map[i][j]=e[i][j]=0;
              else
              map[i][j]=e[i][j]=9999999;
            for(int i=1;i<=m;i++)
            {
                x=init();y=init();z=init();
                map[x][y]=map[y][x]=z;
                e[x][y]=e[y][x]=z;
            }
            for(int k=1;k<=n;k++)
            {
                for(int i=1;i<=k-1;i++)
                  for(int j=i+1;j<=k-1;j++)
                  ans=min(ans,map[i][j]+e[i][k]+e[k][j]);
                for(int i=1;i<=n;i++)
                  for(int j=1;j<=n;j++)
                  map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
            }
            if(ans==9999999)
            cout<<"No solution."<<endl;
            else cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070976.html
Copyright © 2011-2022 走看看