首页 > 代码库 > BZOJ4727 [POI2017]Turysta

BZOJ4727 [POI2017]Turysta

这题太神了还是去看刺儿神题解吧。

http://www.cnblogs.com/neighthorn/p/6538364.html

#include <cstdio>
#include <algorithm>
using std::min;

const int N=2005;
int n,y,tt,ti,tp,t2,a[N][N],df[N],lo[N],st[N],v[N],bl[N],b[N][N],f[N],g[N],p[N],sz[N],h[N],nx[N];

void sol() {
    int hd=h[1],ta=h[1],x;
    for(int i=2,j;i<=t2;i++) {
        if(a[x=h[i]][hd]) {nx[x]=hd,hd=x; continue;}
        for(j=hd;j!=ta&&a[nx[j]][x];j=nx[j]);
        if(j^ta) nx[x]=nx[j],nx[j]=x; else nx[ta]=x,ta=x;
    }
    int md=hd,i,j=0;
    while(md^ta) {
        if(a[x=nx[md]][hd]) {md=x; continue;}
        for(i=hd;i!=md&&a[i][x];j=i,i=nx[i]);
        if(i^md) nx[j]=x,nx[md]=hd,md=x,hd=i;
        else {
            for(i=nx[x];;i=nx[i]) for(j=hd;j^x;j=nx[j]) if(a[i][j]) goto lb;
            lb:for(y=x;;y=nx[y]) if(y==i) break;
            for(nx[md]=hd,hd=j,md=i;nx[j]^hd;j=nx[j]);
            nx[j]=x;
        }
    }
    nx[ta]=hd;
}
void tj(int x) {
    df[x]=lo[x]=++ti,st[++tp]=x,v[x]=1;
    for(int i=1;i<=n;i++) if(a[x][i]) {
        if(!df[i]) tj(i),lo[x]=min(lo[x],lo[i]);
        else if(v[i]) lo[x]=min(lo[x],df[i]);
    }
    if(df[x]==lo[x]) {p[++tt]=x,t2=0; do v[y=st[tp--]]=0,bl[y]=tt,h[++t2]=y,sz[tt]++; while(y^x); sol();}
}

int dp(int x) {
    if(f[x]) return f[x];
    for(int i=1;i<=tt;i++) if(b[x][i]&&f[x]<dp(i)) f[x]=dp(i),g[x]=i;
    f[x]+=sz[x]; return f[x];
}
void sol2(int x) {
    if(!x) return;
    printf(" %d",x);
    for(int i=nx[x];i^x;i=nx[i]) printf(" %d",i);
    sol2(p[g[bl[x]]]);
}

int main() {
    scanf("%d",&n);
    for(int i=2;i<=n;i++) for(int j=1;j<i;j++) {scanf("%d",&y); if(y) a[j][i]=1; else a[i][j]=1;}
    for(int i=1;i<=n;i++) if(!df[i]) tj(i);
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(bl[i]^bl[j]) b[bl[i]][bl[j]]|=a[i][j];
    for(int i=1;i<=tt;i++) dp(i);
    for(int i=1;i<=n;i++) printf("%d",f[bl[i]]),sol2(i),puts("");
    return 0;
}

BZOJ4727 [POI2017]Turysta