HDU - 3829 二分图的最大独立集

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829
题目大意:
图片说明
图片说明
思路:如果A喜欢==B不喜欢||A不喜欢==B喜欢。那么A和B不能同时满足。连一条边。因为如果孩子的喜欢动物是猫,那么他/她的不喜欢动物一定是狗,反之亦然。那么可以证明一定一个二分图。就是求二分图的最大独立集。

#include  <map>
#include  <set>
#include  <cmath>
#include  <queue>
#include  <cstdio>
#include  <vector>
#include  <climits>
#include  <cstring>
#include  <cstdlib>
#include  <iostream>
#include  <algorithm>
#define LL long long
using namespace std;

const int INF=1e9;
const int maxn=505;// 最大点数
vector<int> G[maxn];
int Mx[maxn],My[maxn],Nx,Ny;//Mx[i]表示左集合i顶点所匹配的右集合的顶点序号
int dx[maxn],dy[maxn],dis;//My[i]表示右集合i顶点所匹配的左集合的顶点序号
bool vis[maxn];

 //寻找 增广路径集
bool searchP(){
    queue<int> q;
    dis=INF;
    memset(dx,-1,sizeof(dx));
    memset(dy,-1,sizeof(dy));
    for(int i=1;i<=Nx;i++){
        if(Mx[i]==-1){
            q.push(i);dx[i]=0;
        }
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        if(dx[u]>dis) break;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(dy[v]==-1){
                dy[v]=dx[u]+1;
                if(My[v]==-1) dis=dy[v];
                else{
                    dx[My[v]]=dy[v]+1;
                    q.push(My[v]);
                }
            }
        }
    }
    return dis!=INF;
}
//寻找路径 深度搜索
bool dfs(int u){
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i];
        if(!vis[v]&&dy[v]==dx[u]+1){
            vis[v]=1;
            if(My[v]!=-1&&dy[v]==dis) continue;
            if(My[v]==-1||dfs(My[v])){
                My[v]=u;
                Mx[u]=v;
                return true;
            }
        }
    }
    return false;
}
//得到最大匹配的数目
int MaxMatch(){
    int res=0;
    memset(Mx,-1,sizeof(Mx));
    memset(My,-1,sizeof(My));
    while(searchP()){
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=Nx;i++){
            if(Mx[i]==-1&&dfs(i)) res++;
        }
    }
    return res;
}

string s1[505], s2[505];
int main(){
    int n1, n2, n3;
    string a, b;
    while(~scanf("%d%d%d", &n1, &n2, &n3)){
        for(int i=1; i<=n3; i++){
            cin>>a>>b;
            s1[i]=a;
            s2[i]=b;
        }
        for(int i=1; i<=n3; i++){
            for(int j=i+1; j<=n3; j++){
                if(s1[i]==s2[j]||s2[i]==s1[j]){
                    G[i].push_back(j);
                    G[j].push_back(i);
                }
            }
        }
        Nx=Ny=n3;
        printf("%d\n", n3-MaxMatch()/2);
        for(int i=1; i<=n3; i++) G[i].clear();
    }

    return 0;
}
全部评论

相关推荐

但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务