• 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
  • 相关阅读:
    006 编程语言分类(我总不能扣内存条用计算机吧)
    002 Typora 的使用(markdown 的使用)
    05 神经网络语言模型(独热编码+词向量的起源)
    004 计算机五大组成(计算机组成原理)
    IfcTimeSeriesValue
    IfcEventTime
    IfcResourceTime
    IfcWorkTime
    IfcURIReference
    参数日志
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3283016.html
Copyright © 2020-2023  润新知