HDU2444 【二分图判定+最大匹配】

套模板很好的题?

#include<bits/stdc++.h>
using namespace std; 

const int N=2e2+10;
const int M=4e4+10;

struct asd{
	int to;
	int next;
};
asd q[M];
int head[M],tol;
int n,m;
int col[N];

void add(int u,int v)
{
	q[tol].to=v;
	q[tol].next=head[u];
	head[u]=tol++;
}

void init()
{
	tol=0;
	memset(head,-1,sizeof(head));
	
}

int cy[N];
bool vis[N];
bool Find(int u)
{
	for(int i=head[u];i!=-1;i=q[i].next)
	{
		int v=q[i].to;
		if(!vis[v])
		{
			vis[v]=1;
			if(cy[v]==-1||Find(cy[v]))
			{
				cy[v]=u;
				return true;
			}
		}
	}
	return false;
}

bool Judge(int s)
{
	queue<int>que;
	col[s]=0;
	que.push(s);
	while(!que.empty())
	{
		int u=que.front();que.pop();
		for(int i=head[u];i!=-1;i=q[i].next)
		{
			int v=q[i].to;
			if(col[v]==-1)
			{
				col[v]=1-col[u];
				que.push(v);
			}
			else{
				if(col[v]==col[u])
					return false;
			}
		}
	}
	return true;
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		int u,v;
		init();
		while(m--)
		{
			scanf("%d%d",&u,&v);
			add(u,v);
			add(v,u);
		}
		
		int flag=1;
		memset(col,-1,sizeof(col));
		for(int i=1;i<=n;i++)
		{
			if(col[i]==-1)
			{
				if(!Judge(i))
				{
					flag=0;
					break;
				}
			}
		}
		
		if(!flag){
			puts("No");
			continue;
		}
		
		int ans=0;
		memset(cy,-1,sizeof(cy));
		for(int i=1;i<=n;i++)
		{
			memset(vis,0,sizeof(vis));
			if(Find(i))
				ans++;	
		}
		printf("%d\n",ans>>1);
	}
	return 0;
}


posted @ 2017-01-18 21:13  see_you_later  阅读(153)  评论(0编辑  收藏  举报