题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
最大独立集,匈牙利
贴代码
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1505;
int son[maxn*maxn*2],nxt[maxn*maxn*2];
int link[maxn],check[maxn];
bool vis[maxn];
int n,tot;
void add(int x,int y){
tot++;son[tot]=y;nxt[tot]=link[x];link[x]=tot;
}
bool dfs(int x){
for (int j=link[x];j!=0;j=nxt[j]){
if (!vis[son[j]]){
vis[son[j]]=true;
if ((check[son[j]]==-1)||(dfs(check[son[j]]))){
check[son[j]]=x;
return 1;
}
}
}
return 0;
}
int main(){
// freopen("1068.in","r",stdin);
// freopen("1068.out","w",stdout);
while (scanf("%d",&n)!=EOF){
scanf("\n");tot=0;
memset(link,0,sizeof(link));
memset(check,-1,sizeof(check));
for (int i=1;i<=n;i++){
int x,y,k;
char ch1,ch2,ch3;
scanf("%d",&x);
x++;
scanf("%c%c%c",&ch1,&ch2,&ch3);
scanf("%d",&k);
scanf("%c",&ch1);
for (int j=1;j<=k;j++){
scanf("%d",&y);
y++;add(x,y);add(y,x);
}
scanf("\n");
}
int ans=0;
for (int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if (dfs(i))ans++;
}
int sum=n-ans/2;
printf("%d\n",sum);
}
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/07/16 15:37:58
Ending.