zoj 1137 || 1466 Girls and Boys

    技术2022-05-20  66

     

    二分图的最大独立集=顶点数-二分图的最大匹配数

    二分图的最小顶点覆盖=二分图的最大匹配数

    二分图的最小路径覆盖=顶点数-二分图的最大匹配数

     

    zoj上居然没写数据范围。。。poj写了。

     

    这题是求最大独立集。

     

    给你 romantically involved 的关系,求出最多的不满足这个关系的集合数。

     

    因为1-2 2-1 算的话就算两次了,我就变成一条边,结果一直WA = =。。。这种做法最后还是不可取。看discuss,另一种做法,就是按输入建图,然后求出最大匹配边,然后结果就是 n - (最大匹配边)/2 = =。。。TLE了。。好吧。

     

     

    我改成邻接表形式的矩阵,发现赋值有问题,这题是从0开始的,所以match数组不能标记成0。。 = =。。

     

    后来试试邻接矩阵,也能过,不过时间长了点。

     

    #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> #define MAX 505 using namespace std; int map[MAX][MAX]; int used[MAX]; int match[MAX]; int len[MAX]; int Augement(int n,int x) { int i,k; for(i=0; i<len[x]; i++) { k = map[x][i]; if( !used[k] ) { used[k] = 1; if( match[k] == -1 || Augement(n,match[k]) ) { match[k] = x; return 1; } } } return 0; } int Hungary(int n) { int i,sum = 0; memset(match,-1,sizeof(match)); for(i=0; i<n; i++) { memset(used,0,sizeof(used)); if( Augement(n,i) ) sum++; } return sum; } int main() { int n,num,to,from,i,ans; while( ~scanf("%d",&n) ) { memset(map,0,sizeof(map)); memset(len,0,sizeof(len)); for(i=0; i<n; i++) { scanf("%d: (%d)",&from,&num); while( num-- ) { scanf("%d",&to); map[from][len[from]++] = to; } } ans = Hungary(n); printf("%d/n",n-(ans+1)/2); } return 0; }  


    最新回复(0)