码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-06 16:48:09      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:poj   算法   

题意:

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

分析:

匈牙利算法。

代码:

//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;	
}


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

标签:poj   算法   

原文地址:http://blog.csdn.net/sepnine/article/details/43565413

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!