HDU2768Cat vs. Dog(最大独立集)

题意:C只猫。D只狗,V为观众的投票,格式CX,DY支持CX留下,让DY出局。问怎么抉择能最多留下观众,输出最多的观众数

思路:关键还是建图,就是把题目的某种关系建成二分图,这里我们选择人物的对立关系,建立边,对立的人分为二个集合,他们之间连边,

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<limits>
#include<ctime>
#include<cassert>
#include<cstdlib>
#define lson (rt<<1),L,M
#define rson (rt<<1|1),M+1,R
#define M ((L+R)>>1)
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define fread(a) freopen(a,"r",stdin);
#define fwrite(a) freopen(a,"w",stdout);
using namespace std;
const int maxn=505;
const int inf=999999;

char x[maxn][6];
char y[maxn][6];

vector<int> G[maxn];
int matching[maxn];
bool vis[maxn];
int num;
bool dfs(int u){
    int N=G[u].size();
    for(int i=0;i<N;i++){
        int v=G[u][i];
        if(vis[v])continue;
        vis[v]=true;
        if(matching[v]==-1||dfs(matching[v])){
            matching[v]=u;
            return true;
        }
    }
    return false;
}
int hungar(){
    int ans=0;
    cl(matching,-1);
    for(int i=0;i<num;i++){
        cl(vis,false);
        if(dfs(i))ans++;
    }
    return ans/2;//除以2 ,因为算的是全部
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int c,v,d;
        scanf("%d%d%d",&c,&d,&v);
        for(int i=0;i<maxn;i++){
            G[i].clear();
        }
        for(int i=0;i<v;i++){
           scanf("%s%s",x[i],y[i]);
           for(int j=0;j<i;j++)if(i!=j){
                if(strcmp(x[i],y[j])==0||strcmp(y[i],x[j])==0){
                    G[i].pb(j);
                    G[j].pb(i);//此处注意 ,因为下面为了简单枚举所有的点了,所以把图建成这样的
                }
           }
        }
        num=v;
        printf("%d\n",v-hungar());
    }
    return 0;
}
/*
10
5 5 5
C1 D2
C1 D2
C1 D3
D1 C4
D3 C4
1 1 2
C1 D1
D1 C1
1 2 4
C1 D1
C1 D1
C1 D2
D2 C1
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 23:30:23

HDU2768Cat vs. Dog(最大独立集)的相关文章

hdu2768Cat vs. Dog (反建法,最大独立集)

Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1520 Accepted Submission(s): 570 Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunch of c

hdu2768-Cat vs. Dog:图论:二分匹配

Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1602    Accepted Submission(s): 606 Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunch

hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图

题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的,那么就建一条边.留下多少人,就是求最大独立集. 最大独立集= 顶点数 - 最大匹配数 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #inc

Hdu_3829 Cat VS Dog -最大独立集+建图

题意:动物园有n种猫,m种狗,小孩子喜欢猫就讨厌狗,喜欢狗就讨厌猫,只要孩子们不喜欢的东西不在,他们就开心,问他们的最大开心度. 分析:建图是个难点,反正我是不会建的,搜了题解才意识到可以建"矛盾边"这种东西.只要孩子们喜欢的东西有冲突就连边,最后找到最大的独立集就是答案了 /************************************************ Author :DarkTong Created Time :2016/8/1 17:20:09 File Nam

二分图的一大泼基础题

[HDU]//1068 Girls and Boys 最大匹配★//1150 Machine Schedule 最小点覆盖★1151 Air Raid 最小路径覆盖★//1179 Ollivanders 最大匹配★1281 棋盘游戏 行列匹配+求关键点★★1498 50 years, 50 colors 行列匹配★1507 Uncle Tom's Inherited Land* 黑白染色+奇偶匹配(1X2的矩形覆盖)★//1528 Card Game Cheater 最大匹配★1845 Jimm

Hdu匹配题集

普通匹配,多重匹配[HDU]1068Girls and Boys 最大匹配★1150Machine Schedule 最小点覆盖★1151Air Raid 最小路径覆盖★1179Ollivanders 最大匹配★1281棋盘游戏 行列匹配+求关键点★★149850 years, 50 colors 行列匹配★1507Uncle Tom's Inherited Land* 黑白染色+奇偶匹配(1X2的矩形覆盖)★1528Card Game Cheater 最大匹配★1845Jimmy’s Assi

UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)

UVA 12168 - Cat vs. Dog 题目链接 题意:给定一些猫爱好者,和一些狗爱好者,每个人都有一个喜欢的猫(狗),和一个讨厌的狗(猫),要问现在给一种方案,使得尽量多的人被满足 思路:二分图匹配最大独立集,猫爱好者和狗爱好者矛盾的建边,做一次最大独立集即可 代码: #include <cstdio> #include <cstring> #include <vector> using namespace std; const int N = 505; in

HDU 3829 - Cat VS Dog (二分图最大独立集)

题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动物被移走,这个小孩会很高兴.现在问最多可以让多少个小孩高兴. 此题是求二分图最大独立集. 二分图比较明显,但是难在建图.这个题是找到最多的喜欢猫和喜欢狗而不互相冲突的小孩,这样我们将喜欢动物相互冲突的小孩之间连边,问题就变成了求二分图的最大独立集. 在二分图中,最大独立集=顶点数-最大匹配数. 求解

(hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)

称号: Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 219 Accepted Submission(s): 86   Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunch