POJ 1466 Grils And Boys
2010-11-04 19:53
330 查看
给m个点,和若干条边,要求选出一个最大的点集,使得任意两点间无边,其实就是求二部图的最大独立集
不过这道题没有明显给出二分图的两部分,于是可以每一边都包含所有顶点,这样求出来的最大匹配就是二部图的两倍
对于二部图,最大独立集=顶点数-最大匹配数
代码:
不过这道题没有明显给出二分图的两部分,于是可以每一边都包含所有顶点,这样求出来的最大匹配就是二部图的两倍
对于二部图,最大独立集=顶点数-最大匹配数
代码:
#include<iostream> using namespace std; struct edge { int v; struct edge *next; }*adj[505],mempool[5000]; int u[505],link[505]; int n,k; int dfs(int t) { int i,cv; struct edge *ptr; for(ptr=adj[t];ptr;ptr=ptr->next) { cv=ptr->v; if(!u[cv]) { u[cv]=1; if(link[cv]==-1||dfs(link[cv])) { link[cv]=t; return 1; } } } return 0; } int hungary() { int i,num=0; memset(link,-1,sizeof(link)); for(i=1;i<=n;i++) { memset(u,0,sizeof(u)); if(dfs(i)) num++; } return num; } int main() { int i,j,c,a,maxMatch; char x[10],num[20]; while(scanf("%d",&n)!=EOF) { k=0; for(i=1;i<=n;i++) { adj[i]=NULL; scanf("%s",&x); getchar(); getchar(); scanf("%d",&c); getchar(); for(j=1;j<=c;j++) { scanf("%d",&a); a++; struct edge *ptr=&mempool[k++]; ptr->v=a; ptr->next=adj[i]; adj[i]=ptr; struct edge *ptr1=&mempool[k++]; ptr1->v=i; ptr1->next=adj[a]; adj[a]=ptr1; } } maxMatch=hungary(); printf("%d/n",n-maxMatch/2); } return 0; }
相关文章推荐
- POJ-1466 Girls and Boys 二分图+拆点构图
- poj1466 Girls and Boys
- POJ - 1466 Girls and Boys 二分图+最大独立集
- POJ 1466 - Girls and Boys(二分图匹配)
- 网络流(最大独立点集):POJ 1466 Girls and Boys
- POJ-1466-Girls and Boys(二分图最大独立集)
- POJ 1466 Girls and Boys 最大独立集
- POJ1466 Girls and Boys【二分图最大独立集】
- Girls and Boys(poj 1466)
- POJ 1466 Girls and Boys
- poj&nbsp;1466&nbsp;Girls&nbsp;and&nbsp;Boys(最大独立…
- POJ 1466 Girls and Boys 求最大独立点集
- POJ 1466 Girls and Boys (最大独立点集)
- zoj 1137 Girls and Boys(poj 1466)(最大独立点集)
- poj 1466 Girls and Boys 二分图的最大匹配
- poj 1466 Girls and Boys(二分图最大匹配)
- POJ 1466 Girls and Boys(二分图匹配)
- 【POJ】[1466]Girls and Boys
- POJ1466-Girls and Boys
- poj 1466 Girls and Boys