POJ 1734 Sightseeing trip

题目大意:

求一个最小环。

用Floyd 求最小环算法。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
#define INF 0xfffffff
#define maxn 260

int G[maxn][maxn], dist[maxn][maxn];
int Pre[maxn][maxn], Path[maxn];
int m, n, CrossNum = 0;


void SearchPath(int Star,int End)
{
    while(Star != End)
    {
        Path[CrossNum ++] = Star;
        Star = Pre[Star][End];
    }
    Path[CrossNum ++] = Star;
}

void Floyd()
{
    int MinLoop = INF;
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<k; i++)
        {
            for(int j=i+1; j<k; j++)
            {
                if( dist[i][j] + G[i][k] + G[k][j] < MinLoop )
                {
                    MinLoop =  dist[i][j] + G[i][k] + G[k][j];
                    CrossNum = 0;
                    SearchPath(i,j);
                    Path[CrossNum++] = k;
                }
            }
        }


        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(dist[i][j] > dist[i][k] + dist[k][j])
                {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    Pre[i][j] = Pre[i][k];
                }
            }
        }
    }
}
void Init()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            dist[i][j] = G[i][j] = INF;
            Pre[i][j] = j;
            CrossNum = 0;
        }
    }
}


int main()
{
    while(cin >> n >> m)
    {


        Init();

        for(int i=0; i<m; i++)
        {
            int a, b, c;

            cin >> a >> b >> c;

            G[a][b] = G[b][a] = dist[a][b] = dist[b][a] = min(dist[a][b], c);
        }

        Floyd();

        if( CrossNum)
        {

            for(int i=0; i<CrossNum - 1; i++)
            {
                printf("%d ", Path[i]);
            }
            printf("%d
", Path[CrossNum - 1]);
        }
        else
            cout <<"No solution." << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenchengxun/p/4176909.html