当前位置: 代码迷 >> 综合 >> poj 3342 Party at Hali-Bula 判断二分图最大点独立集是否唯一
  详细解决方案

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

热度:61   发布时间:2024-01-19 05:58:48.0

题意:

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

分析:

匈牙利算法。

代码:

//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");elseprintf("No\n");}return 0;	
}