zoukankan      html  css  js  c++  java
  • 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 }
    心之所动 且就随缘去吧
  • 相关阅读:
    解决函数内this指向
    .Math 数值对象
    时间函数
    数学中的弧度和角度
    闭包
    在拖拽元素的时候,如果元素的内部加了文字或者图片,拖拽效果会失灵?
    正则
    JS高级-事件对象
    JS高级-事件捕捉
    JS高级-面向对象
  • 原文地址:https://www.cnblogs.com/iat14/p/12076671.html
Copyright © 2011-2022 走看看