• hdu 1599 find the mincost route floyd求最小环


    就是i到j的最短路,配上刚加入图的边,i到k,k到j,来构成一个没有重复边的环。

    i到j是最短路,不会重复一条边两次,i到k,k到j刚加入图,显然也不会出现在最短路里。

    要注意的是,求环的时候要保持i,j,k不相等。dis数组和初始的mp数组要区分开。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 int ans,n,m;
     6 int mp[110][110],dis[110][110];
     7 void floyd()
     8 {
     9     for (int k = 1;k <= n;k++)
    10     {
    11         for (int i = 1;i <= n;i++)
    12             for (int j = 1;j <= n;j++)
    13                 if (i != j && j != k && i != k)
    14                     ans = min(ans,dis[i][j] + mp[j][k] + mp[k][i]);
    15         for (int i = 1;i <= n;i++)
    16             for (int j = 1;j <= n;j++)
    17                 dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
    18     }
    19 }
    20 int main()
    21 {
    22     while (scanf("%d%d",&n,&m) > 0)
    23     {
    24         memset(mp,0x1f,sizeof(mp));
    25         memset(dis,0x1f,sizeof(dis));
    26         ans = mp[0][0];
    27         int tx,ty,tv;
    28         for (int i = 1;i <= m;i++)
    29         {
    30             scanf("%d%d%d",&tx,&ty,&tv);
    31             dis[tx][ty] = mp[tx][ty] = min(mp[tx][ty],tv);
    32             dis[ty][tx] = mp[ty][tx] = min(mp[ty][tx],tv);
    33         }
    34         floyd();
    35         if (ans != mp[0][0])
    36             printf("%d
    ",ans);
    37         else
    38             printf("It's impossible.
    ");
    39     }
    40 }
    心之所动 且就随缘去吧
  • 相关阅读:
    Docker容器Centos容器安装openssh
    DEVOPS技术实践_15:使用Docker作为Jenkins的slave
    DEVOPS技术实践_14:使用docker部署jenkins
    oracle数据库创建实例
    Java 覆写初探
    Java super和this小结
    Java 继承学习
    Java 数据表映射
    Java 单向链表学习
    Java 继承初探
  • 原文地址:https://www.cnblogs.com/iat14/p/12076671.html
Copyright © 2020-2023  润新知