zoukankan      html  css  js  c++  java
  • HDU 1068 Girls and Boys(二分图+匈牙利算法)

    http://acm.hdu.edu.cn/showproblem.php?pid=1068

    这题是模板题。

    题目大意:给你每个人互相认识的人,然后问最多能找到多少个人都互不认识。其实就是找:最大独立集合!
    已知:二分图最大独立集合 = 节点数 - 最大匹配数
    而:最大匹配数=最大匹配  /  2。
    用匈牙利算法先算出最大匹配,然后就可以解了。对于这个算法,每次找到增广路后,只需记录cy,就y集合中对应的x元素,因为每次查找都是从x开始,这样在深搜过程中就可以判断出下面,即y元素集合中是否已经被匹配了,无需cx,cy都记录。
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #define maxn 1000//表示x集合和y集合中顶点的最大个数!
     int nx,ny;//x集合和y集合中顶点的个数
     int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配
     int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个!
     int visited[maxn];//用来记录该顶点是否被访问过!
     int path(int u)
     {
         int v;
         for(v=0;v<ny;v++)
         {
             if(edge[u][v]&&!visited[v])
             {
                 visited[v]=1;
                if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路
                 {
                     //cx[u]=v;这是无向图中才要的
                     cy[v]=u;
                     return 1;
                 }
             }
         }
         return 0;
     }
     int maxmatch()
     {
         int res=0,i;
         for(i=0;i<maxn;i++)
            cx[i]=cy[i]=-1;//初始值为-1表示两个集合中都没有匹配的元素!
         for(i=0;i<=nx;i++)
         {
             if(cx[i]==-1)
             {
                 memset(visited,0,sizeof(visited));
                 res+=path(i);
             }
         }
         return res;
     }
     int main()
     {
         int i,n,j,x,y,ans;
         while(scanf("%d",&nx)!=EOF)
         {
             ny=nx;
             memset(edge,0,sizeof(edge));
             for(i=0;i<nx;i++)
             {
                scanf("%d: (%d)",&x,&n);
                for(j=0;j<n;j++)
                {
                    scanf("%d",&y);
                    edge[x][y]=1;
                }
             }
             /*for(i=0;i<nx;i++)
                for(j=0;j<ny;j++)
                if(edge[i][j])printf("%d-->%d
    ",i,j);*/
             ans=maxmatch();
             ans/=2;
             printf("%d
    ",nx-ans);
         }
         return 0;
     }
    View Code
  • 相关阅读:
    Linux 配置中文环境
    CookieContainer 丢失Cookie
    h5调用摄像头
    网络编程之Reactor 模式
    图形化命令行工具:
    关于VSTO调用Excel后进程无法退出的解决方案:
    ActionLink()与jquery更好地结合建造MVC网页:
    实现一个特殊栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
    用数组结构实现大小固定的栈和队列
    比较器整理
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3283016.html
Copyright © 2011-2022 走看看