zoukankan      html  css  js  c++  java
  • HDU1599(Floyd最小环)

    Floyd最小环理解+模板:

    https://www.cnblogs.com/DF-yimeng/p/8858184.html

    除了上述博文里写的,我再补充几点我的理解。

    1.为什么先枚举ij求经过ijk的最小环更新k?

    因为更新了K点,dis[i][j]可能会经过K,那么再枚举ij求ijk可能会得到来回相同的路,那么就不是环了。

    2.为什么需要两个数组?

    一个数组dis[][]表示的是正常从u到v经过k的最短路,

    另一个数组mp[][]表示的是不经过k的时候回来的时候的最短路。

    通过mp[][]找与k相邻的两个点到k的距离,如下图的情况即找x2和x3到k的距离。通过dis[][]找到与k相邻两点之间的最短距离,如下图的情况即找x2->x3的最短距离。

    x1->x2->k->x3->...->x9

    HDU1599

    https://vjudge.net/problem/HDU-1599

    杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。

    Input第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
    接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。Output对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".Sample Input

    3 3
    1 2 1
    2 3 1
    1 3 1
    3 3
    1 2 1
    1 2 3
    2 3 1

    Sample Output

    3
    It's impossible.

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int inf=1e8;
     4 const int maxn=105;
     5 int dis[maxn][maxn];//表示的正常从u到v经过k的最短路
     6 int mp[maxn][maxn];//表示的是不经过k的时候回来的时候的最短路
     7 int n,m,u,v,w;
     8 int i,j,k;
     9 void floyd()
    10 {
    11     int minn=inf;
    12     for(k=1;k<=n;k++)
    13     {
    14         for(i=1;i<k;i++)
    15           for(j=i+1;j<k;j++)
    16               minn=min(minn,dis[i][j]+mp[j][k]+mp[k][i]);
    17         for(i=1;i<=n;i++)
    18           for(j=1;j<=n;j++)
    19             dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    20     }
    21     if(minn==inf)
    22         cout<<"It's impossible."<<endl;
    23     else
    24         cout<<minn<<endl;
    25 }
    26 int main()
    27 {
    28     while(~scanf("%d%d",&n,&m))
    29     {
    30         for(i=0;i<=n;i++)
    31             for(j=0;j<=n;j++)
    32             mp[i][j]=dis[i][j]=inf;
    33         //memset(mp,0x3f,sizeof mp);
    34         for(i=1;i<=m;i++)
    35         {
    36             cin>>u>>v>>w;
    37             mp[u][v]=mp[v][u]=dis[u][v]=dis[v][u]=min(w,mp[u][v]);
    38         }
    39         floyd();
    40     }
    41     return 0;
    42 }

    思路:

    floyd最小环的模板题。

    注意点:

    一开始把无穷值设为0x3f3f3f3f,WA了。把值改为1e8或者1e7(>1000(道路最大数)*100(站点最大数))就能AC,至今不明原因。(>人<;)

    
    
  • 相关阅读:
    01_Linux基础篇
    Docker
    Day02_IP地址详解&进制转换&DOS基本命令与批处理
    Day01_虚拟化架构与系统部署
    重学TCP/IP协议和三次握手四次挥手
    作为一个程序员,CPU的这些硬核知识你必须会!
    通过docker-compose制作dubbo-admin和zookeeper组合服务
    双主master-master复制Err 1677故障分析
    唐宇迪-人工智能学习路线(上篇)
    DNS访问原理只需9个步骤
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/10733135.html
Copyright © 2011-2022 走看看