$POJ1734\ Sightseeing\ trip$ 最小环

\(Sol\)

\(Floyed\)求最小环板子题,具体见图论专题.

\(Code\)

#include<iostream>
#include<cstdio>
#include<vector>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
    Ri x=0,y=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*y;
}
const int N=1010;
int n,m,rem[N][N],b[N],ct;ll a[N][N],f[N][N],as=1LL*inf*1000000;
il void sol(Ri l,Ri r)
{
    if(rem[l][r]==-1)return;
    sol(l,rem[l][r]);
    b[++ct]=rem[l][r];
    sol(rem[l][r],r);
}
int main()
{
    n=read(),m=read();
    go(i,1,n)go(j,1,n)a[i][j]=f[i][j]=as,rem[i][j]=-1;
    go(i,1,m)
    {
    Ri u=read(),v=read(),w=read();
    a[u][v]=a[v][u]=f[u][v]=f[v][u]=min(a[u][v],(ll)w);
    }
    go(k,1,n)
    {
    go(i,1,k-1)
        go(j,i+1,k-1)
        {
        if((f[i][j]+a[j][k]+a[k][i])<as)
        {
            as=f[i][j]+a[j][k]+a[k][i];
            ct=0;
            sol(i,j);
            b[++ct]=j;b[++ct]=k;b[++ct]=i;
        }
        }
    go(i,1,n)
        go(j,1,n)
        if(f[i][k]+f[k][j]<f[i][j])
        f[i][j]=f[i][k]+f[k][j],rem[i][j]=k;
    }
    if(as==1LL*inf*1000000){printf("No solution.\n");return 0;}
    go(i,1,ct){printf("%d ",b[i]);}printf("\n");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/forward777/p/11716455.html