P1894 [USACO4.2] 完美的牛栏The Perfect Stall

原题链接

题解

二分图匹配,总的来说就是如果我的位子没人霸占,那我就坐,如果没人霸占,那我尝试着让他滚蛋
如果一个位子经历过两次滚蛋,说明别人确实没位子坐了,人家确实需要这个位子,那我就换一个位子

code

#include<bits/stdc++.h>
using namespace std;
int belong[205]={0};
int vis[205]={0};
vector<int> G[205];
int ss(int now)//这个函数的定义为搜索当前节点能否找到归属
{
    for(auto to:G[now]) if((!belong[to]||(!vis[to]&&(vis[to]=1)&&ss(belong[to])))&&(belong[to]=now)) return 1;//用&&完成赋值
    //如果这个点没有被滚蛋过,那就访问这个点,让他滚蛋,或者是这个点还没有人踏足过
    return 0;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int k;
        cin>>k;
        while(k--)
        {
            int x;
            cin>>x;
            G[i].push_back(x);
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof vis);//记录牛棚的访问情况,如果塞入当前节点的时候牛棚访问超过两次,说明出现循环调用,而这时调用这个点的可以是任何点
        sum+=ss(i);
    }
    cout<<sum<<endl;
    return 0;
}

posted @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示