您的位置:首页 > 其它

poj 3342 Party at Hali-Bula 判断二分图最大点独立集是否唯一

2015-02-06 15:52 399 查看
题意:

给一个二分图,判断最大点独立集是否唯一。

分析:

匈牙利算法。

代码:

//poj 3342
//sep9
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int maxN=212; 
int n;
int M,v1,v2;
bool g[maxN][maxN];
bool vis[maxN];
int link[maxN];
map<string,int> name;
bool dfs(int x)
{
	for(int y=1;y<=v2;++y)	
		if(g[x][y]&&!vis[y]){
			vis[y]=true;
			if(link[y]==0||dfs(link[y])){
				link[y]=x;
				return true;
			}
		}
	return false;
}

void hungary()
{
	memset(link,0,sizeof(link));
	for(int x=1;x<=v1;++x){
		memset(vis,false,sizeof(vis));
		if(dfs(x))
			++M;
	}	
	return ;
}

int main()
{
	while(scanf("%d",&n)==1&&n){
		memset(g,false,sizeof(g));
		name.clear();
		int i,j;
		string a,b;
		cin>>a;		
		int t=0;
		for(i=0;i<n-1;++i){
			cin>>a>>b;
			if(name[a]==0) name[a]=++t;
			if(name[b]==0) name[b]=++t;
			int x=name[a];
			int y=name[b];
			g[x][y]=g[y][x]=1;
		}
		M=0;
		v1=v2=n;
		hungary();
		printf("%d ",n-M/2);
		int m=M;
		int ok=1,set_unique=1;
		for(i=1;i<=n&&ok;++i){
			for(j=1;j<=n;++j)
				if(g[i][j]==1&&link[j]==i){
					g[i][j]=g[j][i]=0;
					M=0;
					hungary();
					if(M<m){
						set_unique=0;
						ok=0;
						break;
					}
					g[i][j]=g[j][i]=1;
				}
		} 
		if(set_unique==1)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: