hdu 2444(染色法判斷二分圖+匈牙利算法)

題意:首先判斷是否是二分圖,如果不是的話輸出No,如果是的話輸出最大匹配

判斷二分圖:運用染色法,相鄰的兩個點間染不同的顏色,如果遇到相鄰的點是同一顏色的,則不是二分圖

具體實現:通過廣搜遍歷所有的點,判斷是否有相鄰的點是同一顏色(一定要遍歷所有的點),找最大匹配的時候就用匈牙利算法,最後找到的count要除以2,因爲找最大匹配的時候每個點都找了,所以求出的count值是最大匹配的二倍

網上好多代碼都過不了這組數據,因爲沒有遍歷所有的點,表示這一題數據有點水

4 3

2 3

2 4

3 4

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=205;
int flag[N];
int map[N][N];
int match[N];
bool link[N];
int n,m;
int bfs()
{
    int j;
	memset(flag,-1,sizeof(flag));
	for(j=1;j<=n;j++)
	{
	if(flag[j]!=-1) continue;
	queue<int> q;
	flag[j]=1;
    q.push(j);
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		for(int i=1;i<=n;i++)
		{
			if(map[k][i]&&flag[i]==flag[k])
			{
		    	return 0;
			}
			if(map[k][i]&&flag[i]==-1)
			{
				q.push(i);
				flag[i]=1-flag[k];
			}
		}
	}
	}
	return 1;
}
bool find(int x)
{
	int i,k;
	for(i=1;i<=n;i++)
	{
		if(map[x][i]==1)
		{
		  k=i;
		   if(!link[k])
		   {
			link[k]=true;
			if(!match[k]||find(match[k]))
			{
				match[k]=x;
				 return true;
			}
		   }
		}
	}
	return false;
}
int main()
{
	int a,b;
	while(~scanf("%d%d",&n,&m))
	{
	 memset(map,0,sizeof(map));
     while(m--)
	 {
		 scanf("%d%d",&a,&b);
		 map[a][b]=1;
		 map[b][a]=1;
	 }
     if(!bfs())
	 {
		 printf("No\n");continue;
	 }
	 int count=0;
     memset(match,0,sizeof(match));
	 for(int i=1;i<=n;i++)
	 {
		memset(link,false,sizeof(link));
		 if(find(i))
		 {
			 count++;
		 }
	 }
	 printf("%d\n",count/2);
	}
	return 0;
}


 


 

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