HDU1068 Girls and Boys

  題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1068

  最大獨立集,匈牙利

  貼代碼

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1505;
int son[maxn*maxn*2],nxt[maxn*maxn*2];
int link[maxn],check[maxn];
bool vis[maxn];
int n,tot;
void add(int x,int y){
	tot++;son[tot]=y;nxt[tot]=link[x];link[x]=tot;
}
bool dfs(int x){
	for (int j=link[x];j!=0;j=nxt[j]){
		if (!vis[son[j]]){
			vis[son[j]]=true;
			if ((check[son[j]]==-1)||(dfs(check[son[j]]))){
				check[son[j]]=x;
				return 1;
			}	
		}
	}
	return 0;
}
int main(){
//	freopen("1068.in","r",stdin);
//	freopen("1068.out","w",stdout);
	while (scanf("%d",&n)!=EOF){
		scanf("\n");tot=0;
		memset(link,0,sizeof(link));
		memset(check,-1,sizeof(check));
		for (int i=1;i<=n;i++){
			int x,y,k;
			char ch1,ch2,ch3;
			scanf("%d",&x);
			x++;
			scanf("%c%c%c",&ch1,&ch2,&ch3);
			scanf("%d",&k);
			scanf("%c",&ch1);
			for (int j=1;j<=k;j++){
				scanf("%d",&y);
				y++;add(x,y);add(y,x);
			}
			scanf("\n");
		}
		int ans=0;
		for (int i=1;i<=n;i++){
				memset(vis,0,sizeof(vis));
				if (dfs(i))ans++;
			}
		int sum=n-ans/2;
		printf("%d\n",sum);
	}
	return 0;
}
【寫的有漏洞的,歡迎路過大神吐槽】

  2017/07/16 15:37:58

  Ending. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章