zoukankan      html  css  js  c++  java
  • hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图

      题目分析:

        一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人。一个人喜欢的动物如果离开,那么他也将离开。问最多留下多少人。

      思路:

        爱猫和爱狗的人是两个独立的集合。若两个人喜欢和讨厌的动物是一样的,那么就建一条边。留下多少人,就是求最大独立集。

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

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 using namespace std;
      7 const int N=505,INF=0x3f3f3f3f;
      8 int bmap[N][N],cx[N],cy[N],dx[N],dy[N];
      9 bool bmask[N];
     10 int nx,ny,dis,ans;
     11 bool searchpath()
     12 {
     13     queue<int> q;
     14     dis=INF;
     15     memset(dx,-1,sizeof(dx));
     16     memset(dy,-1,sizeof(dy));
     17     for(int i=1;i<=nx;i++)
     18     {
     19         if(cx[i]==-1){ q.push(i); dx[i]=0; }
     20         while(!q.empty())
     21         {
     22             int u=q.front(); q.pop();
     23             if(dx[u]>dis) break;
     24             for(int v=1;v<=ny;v++)
     25             {
     26                 if(bmap[u][v]&&dy[v]==-1)
     27                 {
     28                     dy[v]= dx[u] + 1;
     29                     if(cy[v]==-1) dis=dy[v];
     30                     else
     31                     {
     32                         dx[cy[v]]= dy[v]+1;
     33                         q.push(cy[v]);
     34                     }
     35                 }
     36             }
     37         }
     38     }
     39     return dis!=INF;
     40 }
     41 int findpath(int u)
     42 {
     43     for(int v=1;v<=ny;v++)
     44     {
     45         if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1)
     46         {
     47             bmask[v]=1;
     48             if(cy[v]!=-1&&dy[v]==dis) continue;
     49             if(cy[v]==-1||findpath(cy[v]))
     50             {
     51                 cy[v]=u; cx[u]=v;
     52                 return 1;
     53             }
     54         }
     55     }
     56     return 0;
     57 }
     58 void maxmatch()
     59 {
     60     ans=0;
     61     memset(cx,-1,sizeof(cx));
     62     memset(cy,-1,sizeof(cy));
     63     while(searchpath())
     64     {
     65         memset(bmask,0,sizeof(bmask));
     66         for(int i=1;i<=nx;i++)
     67             if(cx[i]==-1) ans+=findpath(i);
     68     }
     69 }
     70 void init()
     71 {
     72     memset(bmap,0,sizeof(bmap));
     73 }
     74 struct node
     75 {
     76     int x,y;
     77 }c[N],d[N];
     78 int main()
     79 {
     80     //freopen("test.txt","r",stdin);
     81     int cas,i,j,k,n,a,b;
     82     char ch;
     83     scanf("%d",&cas);
     84     while(cas--)
     85     {
     86         scanf("%d%d%d",&a,&b,&n);
     87         init();
     88         j=k=0;
     89         for(i=1;i<=n;i++)
     90         {
     91             getchar();
     92             ch=getchar();
     93             if(ch=='C') {
     94                 scanf("%d",&a);
     95                 c[j].x=a;
     96             }
     97             if(ch=='D') {
     98                 scanf("%d",&a);
     99                 d[k].y=a;
    100             }
    101             scanf(" %c",&ch);
    102             if(ch=='C') {
    103                 scanf("%d",&a);
    104                 d[k++].x=a;
    105             }
    106             if(ch=='D') {
    107                 scanf("%d",&a);
    108                 c[j++].y=a;
    109             }
    110         }
    111         nx=j;ny=k;
    112         for(i=0;i<nx;i++){
    113             for(j=0;j<ny;j++){
    114                 if(c[i].x==d[j].x||c[i].y==d[j].y)
    115                     bmap[i+1][j+1]=1;
    116             }
    117         }
    118         maxmatch();
    119         printf("%d
    ",n-ans);
    120     }
    121     return 0;
    122 }
    View Code
  • 相关阅读:
    visual studio 注释与取消注释
    visual studio错误之 无法将参数 1 从“const char [5]”转换为“char *”
    sdl_ffmpeg_video
    sdl_ffmpeg_audio
    visual studio添加第三方库文件,每次都要配置包含目录和库目录(繁琐),一劳永逸的办法
    visual studio 错误之errorC2362:“gototmpstr”跳过了“XXXX”的初始化操作
    visual studio调用SDL2和ffmpeg
    没用过得库函数
    visual studio编译错误之xx被声明为已否决
    vim把一个文件的若干行追加到另一个文件
  • 原文地址:https://www.cnblogs.com/Potato-lover/p/3986028.html
Copyright © 2011-2022 走看看