1. 程式人生 > >BZOJ4727 [POI2017]Turysta

BZOJ4727 [POI2017]Turysta

spa cst n) printf ret ont int std print

這題太神了還是去看刺兒神題解吧。

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