bzoj1143: [CTSC2008]祭祀river && bzoj27182718: [Violet 4]毕业旅行

其实我至今不懂为啥强联通缩点判入度会错。。。

然后这个求的和之前那道组合数学一样,就是最长反链=最小链覆盖=最大独立集。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int match[110];
bool v[110];
bool mp[110][110];
bool findmuniu(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(mp[x][i]==true)
        {
            if(v[i]==false)
            {
                v[i]=true;
                if(match[i]==0||findmuniu(match[i])==true)
                {
                    match[i]=x;
                    return true;
                }
            }
        }
    }
    return false;
}
int main()
{
    freopen("river.in","r",stdin);
    freopen("river.out","w",stdout);
    int m,x,y;
    scanf("%d%d",&n,&m);
    memset(mp,false,sizeof(mp));
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        mp[x][y]=true;
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            if(k!=i)
                for(int j=1;j<=n;j++)
                    if(k!=j&&i!=j)
                        if(mp[i][k]==true&&mp[k][j]==true)
                            mp[i][j]=true;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        memset(v,false,sizeof(v));
        if(findmuniu(i)==true)ans++;
    }
    printf("%d\n",n-ans);
    return 0;
}

 

posted @ 2018-03-23 17:24  AKCqhzdy  阅读(68)  评论(0编辑  收藏