题意:
给一个二分图,判断最大点独立集是否唯一。
分析:
匈牙利算法。
代码:
//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 判断二分图最大点独立集是否唯一
原文地址:http://blog.csdn.net/sepnine/article/details/43565413