zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    初赛Part2
    数据结构
    ES 匹配条件后分组聚合
    SpringBoot starter 懒人包介绍
    HTTP1.1中容易忽视的知识点
    ​netcore 中间件浅析
    spring boot请求参数验证
    spring boot中统一对响应做处理
    并发请求工具
    抓apk中的https包(​含破解https的SSL Pinning)
  • 原文地址:https://www.cnblogs.com/juruolty/p/7127371.html
Copyright © 2011-2022 走看看