• 解题:CTSC 2008 祭祀


    题面

    洛谷要求输出方案,懒得写了,但是还是放一下链接看看吧

    (虽然现在二分图已经过气了=。=)

    要求最长反链,最长反链=最小链覆盖,先Floyd传递闭包之后链覆盖就变成了边覆盖,然后最小边覆盖=总点数-最大匹配

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=300,M=100000,inf=1e9;
     6 int n,m,s,f,b,t,t1,t2,t3,cnt,ans;
     7 int noww[2*M],goal[2*M],flow[2*M];
     8 int p[N],pp[N],dep[N],que[N],lnk[N][N];
     9 void Link(int f,int t,int v)
    10 {
    11     noww[++cnt]=p[f],p[f]=cnt;
    12     goal[cnt]=t,flow[cnt]=v;
    13     noww[++cnt]=p[t],p[t]=cnt;
    14     goal[cnt]=f,flow[cnt]=0;
    15 }
    16 bool Layering(int st,int ed)
    17 {
    18     for(int i=1;i<=t;i++) pp[i]=p[i];
    19     memset(dep,-1,sizeof dep);
    20     dep[st]=0,que[f=b=0]=st;
    21     while(f<=b)
    22     {
    23         int tn=que[f++];
    24         for(int i=pp[tn];i;i=noww[i])
    25             if(dep[goal[i]]==-1&&flow[i])
    26                 dep[goal[i]]=dep[tn]+1,que[++b]=goal[i];
    27     }
    28     return ~dep[ed];
    29 }
    30 int Augmenting(int nd,int ed,int mn)
    31 {
    32     if(nd==ed||!mn) return mn;
    33     int tmp=0,tep=0;
    34     for(int i=pp[nd];i;i=noww[i])
    35     {
    36         pp[nd]=i;
    37         if(dep[goal[i]]==dep[nd]+1)
    38             if(tep=Augmenting(goal[i],ed,min(mn,flow[i])))
    39             {
    40                 flow[i]-=tep,mn-=tep;
    41                 flow[i^1]+=tep,tmp+=tep;
    42                 if(!mn) break;
    43             }
    44     }
    45     return tmp;
    46 }
    47 void Dinic_Maxflow(int st,int ed)
    48 {
    49     while(Layering(st,ed))
    50         ans+=Augmenting(st,ed,inf);
    51 }
    52 int main()
    53 {
    54     scanf("%d%d",&n,&m),s=2*n+1,t=s+1,cnt=1;
    55     for(int i=1;i<=m;i++)
    56         scanf("%d%d",&t1,&t2),lnk[t1][t2]=true;
    57     for(int k=1;k<=n;k++)
    58         for(int i=1;i<=n;i++)
    59             for(int j=1;j<=n;j++)    
    60                 lnk[i][j]|=lnk[i][k]&lnk[k][j];
    61     for(int i=1;i<=n;i++)
    62         for(int j=1;j<=n;j++)
    63             if(lnk[i][j]) Link(i,j+n,1);
    64     for(int i=1;i<=n;i++)
    65         Link(s,i,1),Link(i+n,t,1);
    66     Dinic_Maxflow(s,t),printf("%d",n-ans);
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    XJTUOJ13 (数论+FFT)
    ZOJ3956 ZJU2017校赛(dp)
    ZOJ3953 ZJU2017校赛(贪心)
    2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)
    LOJ10129
    loj 10127最大数
    noip 选择客栈
    LOJ10121 与众不同
    CQOI 2006 简单题
    校门外的树
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10284159.html
Copyright © 2020-2023  润新知