逆着得最长路POJ1797

POJ1797点击打开链接

这个题很是不错我感觉

很容易把这个题和上一个青蛙跳的题联系起来做,我也确实联系起来了,可还是没能完整得Ac,是因为我的算法思路还是最短路,这里错了

这个题目得要求是,从1到n得公路,最大承载量是多少,不仅仅是求最大值,你得确保那个值在这一个通路上都能满足承载得值比如限制1 - 2 上是3,2 - 3上是5,1-3上是4,那么结果是4,虽然5大,但5只满足2-3,没法满足1-2,所以变相得就是求’最长路‘,第一次初始化出来的值应该是指向得最大得值,因为我们寻找的时候肯定是这条路上的限制越大我们最终得结果才可能越大啊

int net = 0,minlen = -inf;
        for(int j = 1;j <= n;j++)
        {
            if(!vis[j] && dis[j] > minlen)
            {
                minlen = dis[j];
                net = j;
            }
        }

 然后进行dis得松弛,注意这个和青蛙跳不同是不一定每两个节点之间都有路

if(net == 0)break;
        vis[net] = 1;
        for(int j = 1;j <= n;j++)
        {
            if(!vis[j] && mp[net][j] != -inf)
            {
                dis[j] = max(dis[j],min(dis[net],mp[net][j]));
            }
        }

  对于这个dis[j] = max(dis[j],min(dis[net],mp[net][j]));还可以写成if得形式,那样就好明白了

中间的min时求从1到j得所有可能路径中得最大承载量~~~

原文地址:https://www.cnblogs.com/DF-yimeng/p/8514701.html