zoukankan      html  css  js  c++  java
  • hdu 1068 Girls and Boys 最大独立点集 二分匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068

    思路:

    求一集合满足,两两之间没有恋爱关系

    思路:

    最大独立点集=顶点数-最大匹配数

    这里给出的关系,看似有向边,实则是无向边,那么按照二分匹配处理的话,相当于一个人看作两个人来用,最后还是顶点数目-最大二分匹配数

    因为之间一个人当作两个人用,二分匹配数目减半,即 = n - match()/2

    或者也可以写成 = ( 2n -  match() )/2 更容易理解

    题目中n的大小没有说明,最好开大一点,最后测得的大小在500以内

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int maxn=205;
     4 int n;
     5 int g[maxn][maxn],vis[maxn],who[maxn];
     6 bool F(int x) {
     7     for(int i=0; i<n; ++i) {
     8         if(g[x][i]&&!vis[i]) {
     9             vis[i]=1;
    10             if(who[i]==-1||F(who[i])) {
    11                 who[i]=x;
    12                 return true;
    13             }
    14         }
    15     }
    16     return false;
    17 }
    18 int main() {
    19     while(~scanf("%d",&n)) {
    20         memset(g,0,sizeof(g));
    21         memset(who,-1,sizeof(who));
    22         int temp=n,u,v,num;
    23         while(temp--) {
    24             scanf("%d: (%d)",&u,&num);
    25             while(num--) {
    26                 scanf("%d",&v);
    27                 g[u][v]=g[v][u]=1;
    28             }
    29         }
    30         int sum=0;
    31         for(int i=0; i<n; ++i) {
    32             memset(vis,0,sizeof(vis));
    33             if(F(i)) sum++;
    34         }
    35         printf("%d
    ",n-sum/2);
    36     }
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    LINQ基础——WHERE子句
    LINQ基础——LET子句
    LINQ基础——FROM子句
    Guid(全局统一标识符)
    ??运算符
    多线程的AutoResetEvent
    线程池(ThreadPool)
    Mutex
    Monitor类实现线程同步
    【java框架】MyBatis(7)--MyBatis注解开发
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7853150.html
Copyright © 2011-2022 走看看