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
打表