【二分图的独立集 最大完全子图(最大团) 最大完全数】PKU3692 Kindergarten

【二分图的独立集 最大完全子图(最大团) 最大完全数】PKU3692 Kindergarten

独立集:任意两点都不相连的顶点的集合
独立数:独立集中顶点的个数

完全子图:任意两点都相连的顶点的集合
最大完全数:最大完全子图中顶点的个数

最大完全数=原图的补图的最大独立数
最大独立数=顶点数-最大匹配数

这样,就可以求出最大完全数

PKU 3692
 1 #include < iostream >
 2 #include < algorithm >
 3 using   namespace  std;
 4 #define  maxn 210
 5 #define  max(x,y) ((x)>(y)?(x):(y))
 6 bool  map[maxn][maxn],mark[maxn] ;
 7 int  nx,ny,cx[maxn],cy[maxn];
 8 int  path( int  u)
 9 {
10    for (int v = 1;v <= ny; v++
11        if (map[u][v] && !mark[v])
12        {
13            mark[v] = 1 ;
14            if (cy[v] == -1 || path(cy[v])) 
15            {
16                cx[u] = v ; 
17                cy[v] = u ; 
18                return 1 ;
19            }

20        }

21    return 0 ;
22}

23 int  MaxMatch()
24 {
25    int res=0 ;
26    memset(cx , 0xff , sizeof(cx)) ;
27    memset(cy , 0xff , sizeof(cy)) ;
28    for (int i = 1 ; i <= nx ; i++
29        if (cx[i] == -1
30        {
31            memset(mark , 0 , sizeof(mark)) ;
32            res += path(i) ; 
33        }

34    return res ;
35}

36 int  main()
37 {
38    int g,b,m,x,y,k;
39    k=1;
40    while(scanf("%d%d%d",&g,&b,&m)!=EOF)
41    {
42        if(g==0&&b==0&&m==0)
43            break;
44        nx=g,ny=b;
45        for(int i=1;i<=g;i++)
46            for(int j=1;j<=b;j++)
47                map[i][j]=1;
48        while(m--)
49        {
50            scanf("%d%d",&x,&y);
51            map[x][y]=0;
52        }

53        printf("Case %d: %d\n",k++,g+b-MaxMatch());
54    }

55}

你可能感兴趣的:(【二分图的独立集 最大完全子图(最大团) 最大完全数】PKU3692 Kindergarten)