最大独立集=总点数(2个集合)-最大匹配 #include <stdio.h> #include <string.h> #define N 1001 bool use[N]; bool map[N][N]; int link[N]; int n; int search_path(int i) { int v; for (v=0;v<n;v++)//由于在刚开始的时候没有区分2个集合所以每个点都要找 结果就是最大匹配数的2倍 { if (map[i][v] && use[v]==0)//这遍没搜过的点都搜 { use[v]=1; if (link[v]==-1 || search_path(link[v]))//如果v没有被link 就link然后退出 或者 { //找增广路(找到没有被标记的另一个集合的点为止) 每次最大匹配增加1 link[v]=i;//连接找到v的那个点 只标记另一个集合的点 return 1; } } } return 0; } int max_match() { int i,sum=0; memset(link,-1,sizeof(link)); for (i=0;i<n;i++) { memset(use,0,sizeof(use)); if (search_path(i)) sum++; } return sum; } int main () { //freopen("1068.txt","r",stdin); int i,m,u,v; while(scanf("%d",&n)!=EOF) { memset(map,0,sizeof(map)); for (i=0;i<n;i++) { scanf("%d: (%d)",&u,&m); while(m--) { scanf("%d",&v); map[u][v]=1; } } printf("%d/n",n-max_match()/2); } }