【HDU 1599】 Find the mincost route

【题目链接】

          点击打开链接

【算法】

         弗洛伊德求最小环模板

         我们知道,在一个环上,一定有一个有且仅有一个编号最大的点,设这个点为k,起点为i,终点为j,那么

         mincost = dist[i][j] + cost[j][k] + cost[k][i] (dist[i][j]为i到j的最短路)

         所以只需枚举i,j,k,在计算最短路的同时,计算最小环,即可

【代码】

         

#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
const int INF = 1e8;

int i,j,n,m,a,b,c;
int g[MAXN][MAXN],mp[MAXN][MAXN];

inline void floyd()
{
    int i,j,k,ans = INF;
    for (k = 1; k <= n; k++)
    {
        for (i = 1; i < k; i++)
        {
            for (j = i + 1; j < k; j++)
            {
                ans = min(ans,g[i][j]+mp[j][k]+mp[k][i]); 
            }    
        } 
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n; j++)
            {
                g[i][j] = min(g[i][j],g[i][k]+g[k][j]);
            } 
        }
    }    
    if (ans == INF) puts("It's impossible.");
    else printf("%d
",ans); 
}

int main()
{
    
    while (scanf("%d%d",&n,&m) != EOF)
    {
        for (i = 0; i <= n; i++)
        {
            for (j = 0; j <= n; j++)
            {
                g[i][j] = mp[i][j] = INF;
            }
        }
        for (i = 1; i <= m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            g[a][b] = mp[a][b] = min(g[a][b],c);
            g[b][a] = mp[b][a] = min(g[b][a],c);
        } 
        floyd();
    }
    
    return 0;
}
原文地址:https://www.cnblogs.com/evenbao/p/9196345.html