二分图匹配 刚学OI三分钟的蒟蒻求助

P2016 战略游戏

Cindy_Chan @ 2019-11-12 07:40:57

RT

用的二分图匹配,求最小点覆盖

错了一个点,比正确答案多1

#include<bits/stdc++.h>
#define sizen 1550
#define sizem 1550
using namespace std;
struct node{
    int to,nxt;
};
node edge[sizem*2];
int tot = -1, first[sizen], dp[sizen][3], vis[sizen], match[sizen];
void add(int u,int v){
    edge[++tot].to = v;
    edge[tot].nxt = first[u];
    first[u] = tot;
}
int top[2],color[2][sizen];
void dfs(int p,int fa,int col){
    color[col][++top[col]] = p;
    int des;
    for(int i=first[p];i!=-1;i=edge[i].nxt){
        des = edge[i].to;
        if(des == fa) continue;
        dfs(des,p,col^1);
    }
}
bool find(int p){
    int des;
    for(int i=first[p];i!=-1;i=edge[i].nxt){
        des = edge[i].to;
        if(vis[des]) continue;
        vis[des] = 1;
        if(!match[des] || find(match[des])){
            match[des] = p;
            return true;
        }
    }
    return false;
}
int Hungary(){
    int cnt = 0;
    for(int i=1;i<=top[0];i++){
        memset(vis,0,sizeof(vis));
        if(find(color[0][i])) cnt++;
    }
    return cnt;
}
int main(){
    memset(first,-1,sizeof(first));
    int n, id, m, v;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&id,&m);
        while(m--){
            scanf("%d",&v);
            add(id,v);
            add(v,id);
        }
    }
    dfs(0,-1,0);
    printf("%d",Hungary());
    return 0;
}

by 天涯狂生 @ 2019-11-12 21:39:40

大佬你好,大佬再见%%%(手动滑稽)


by PolandBallOffical @ 2020-02-10 11:13:35

我都不会二分图%%%


by 我就是天帝 @ 2020-08-26 16:21:25

打表


|