hdu2768 Cat vs. Dog最大独立集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu2768 Cat vs. Dog最大独立集相关的知识,希望对你有一定的参考价值。


题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=2768​​​
题意:有c只猫,d只狗,有n条意见,每条意见表面保留哪只宠物,丢到哪只宠物,问你最多满足几个人的意见
解析:可以把保留猫的看成一群人,保留狗的看成一群人,这样就构成了一个二分图,然后保留猫和保留狗的人出现分歧就连一条边,问你最多满足几个意见,也就相当于求这个二分图的最大独立集,最大独立集+最小顶点覆盖=顶点数,在二分图中,最小顶点覆盖=最大匹配,所以ans = v-最大匹配

#include <bits/stdc++.h>
using namespace std;
const int maxm = 3e5+100;
const int maxn = 505;
struct node

int to,next;
edges[maxm];
struct kt

string k,t;
cat[maxn],dog[maxn];
int head[maxn],cnt;
int match[maxn],vis[maxn];
void init()

memset(match,-1,sizeof(match));
memset(head,-1,sizeof(head));
cnt = 0;

void addEdge(int from,int to)

edges[cnt].to = to;
edges[cnt].next = head[from];
head[from] = cnt++;

bool dfs(int u)

for(int i=head[u];i!=-1;i = edges[i].next)

int v = edges[i].to;
if(vis[v]) continue;
vis[v] = 1;
if(match[v]==-1 || dfs(match[v]))

match[v] = u;
match[u] = v;
return true;


return false;

int main(void)

int t;
scanf("%d",&t);
while(t--)

int c,d,n;
int cnt1 = 0,cnt2 = 0;
init();
scanf("%d %d %d",&c,&d,&n);
for(int i=0;i<n;i++)

string t1,t2;
cin>>t1>>t2;
if(t1[0]==C)

cat[cnt1].k = t1;
cat[cnt1++].t = t2;

else

dog[cnt2].k = t1;
dog[cnt2++].t = t2;


for(int i =0;i<cnt1;i++)

for(int j=0;j<cnt2;j++)

if(cat[i].k==dog[j].t || cat[i].t==dog[j].k)
addEdge(i,j+cnt1);


int ans = 0;
for(int i = 0;i<n;i++)

memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;

printf("%d\\n",n-ans);

return 0;


以上是关于hdu2768 Cat vs. Dog最大独立集的主要内容,如果未能解决你的问题,请参考以下文章

HDU——2768 Cat vs. Dog

HDU3829 Cat VS Dog(最大独立集)

HDU3829 Cat VS Dog —— 最大独立集

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

hdu 3829 Cat VS Dog 二分图匹配 最大点独立集

HDU--3829--Cat VS Dog最大点独立集