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最大独立集的主要内容,如果未能解决你的问题,请参考以下文章
Cat VS Dog HDU - 3829 (最大独立集 )