LA 3415 (二分图+最大独立集)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1416

题目大意:一个老师带他的一群学生去旅游。带走的这群学生整体必须满足给出四个条件之一。问最多能带走多少学生。

解题思路

二分图匹配题。最初我是这样考虑的:符合条件的学生连一条边,求最大匹配*2就行了。

但是问题却没那么简单。最大匹配保证的是多少人被匹配,至于匹配的东西是否有重复,它就不管了。如果简单的最大匹配数*2,那么中间有一些人被匹配了多次,也就是说人多了!

想要得到独立的人数,则必须使用最大独立集做法。

最大独立集的求法很简单:最大匹配的建图方式反过来!意思说完全不符合条件的才连边,在这题里,就是4个条件都不符合要求的学生连一条边。

然后求最大匹配数,ans=n-match/2。

注意这里为啥要除以2,因为你在建图的时候肯定图方便,用了两层for(1..n)判断i和j然后addedge了吧,这样就成了无向图了。

而Hungry是针对有向图的,所以match数成了原来的2倍,所以要除以2。

二分图中使用链式前向星也是挺好的。

#include "string"
#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;
#define maxn 505
int n,head[maxn],tol,link[maxn];
bool vis[maxn];
struct Edge
{
    int next,to;
}e[maxn*maxn];
struct person
{
    int h;
    char sex;
    string music,sport;
}p[505];
void addedge(int u,int v)
{
    e[tol].to=v;
    e[tol].next=head[u];
    head[u]=tol++;
}
int abs(int x) {return x<0?-x:x;}
bool judge(person a,person b)
{
    if(abs(a.h-b.h)<=40&&a.sex!=b.sex&&a.music==b.music&&a.sport!=b.sport) return true;
    else return false;
}
bool dfs(int u)
{
    for(int i=head[u];i!=-1;i=e[i].next)
    {
        int v=e[i].to;
        if(vis[v]) continue;
        vis[v]=true;
        if(!link[v]||dfs(link[v]))
        {
            link[v]=u;
            return true;
        }
    }
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        memset(link,0,sizeof(link));
        memset(head,-1,sizeof(head));
        tol=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>p[i].h>>p[i].sex>>p[i].music>>p[i].sport;
        }
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
            if(i!=j&&judge(p[i],p[j])) {addedge(i,j);}
        int match=0;
        for(int i=1;i<=n;i++)
        {
            memset(vis,false,sizeof(vis));
            if(dfs(i)) match++;
        }
        printf("%d\n",n-match/2);
    }
}
2815370 neopenx UVALive 3415 Accepted 0 KB 233 ms C++ 4.5.3 1464 B 2014-10-04 21:22:11  
时间: 2024-12-28 17:54:43

LA 3415 (二分图+最大独立集)的相关文章

hdu 3829 二分图最大独立集

将孩子看做点,两个孩子间存在矛盾关系则连一条边,最后求二分图最大独立集即可 // // main.cpp // hdu3829 // // Created by Fangpin on 15/5/29. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <vector>

POJ1466 Girls and Boys【二分图最大独立集】

题目链接: http://poj.org/problem?id=1466 题目大意: 有N个学生,他们之间的某些人比较暧昧,只有认识的人能组成一个集合.问:最多能组成 多少个集合,使得这几个集合之间的学生都没有任何关系. 思路: 从N个图中选出M个点,使得这M个点两两之间没有边,求最大的M是多少.二分图最大独立 集问题.本来应该以男生.女生各一边建二分图求最大独立集,但是这里只有N个点,没有告 诉男生.女生的编号.那么以N个学生为一边.再以N个学生为另一边.将相互联系的人之间 建边.然后求最大匹

hihocoder 1158 质数相关 (二分图最大独立集 最大流ISAP求解)

#1158 : 质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二

POJ 3692 Kindergarten(二分图最大独立集)

题意: 有G个女孩,B个男孩.女孩彼此互相认识,男孩也彼此互相认识.有M对男孩和女孩是认识的.分别是(g1,b1),.....(gm,bm). 现在老师要在这G+B个小孩中挑出一些人,条件是这些人都互相认识.问最多可以挑出多少人. 思路: 女孩之间互相认识,男孩之间互相认识,所以我们可以将连边定义为:不认识.即:若两个节点之间有连边,则两个节点互不认识. 故题意即为选出最多的点使得这些点任意两点之间没有连边.即选最少的点覆盖所有边.(二分图最大独立集/二分图最小点覆盖) 代码: vector<i

杭电1068--Girls and Boys(二分图最大独立集)

Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8863    Accepted Submission(s): 4077 Problem Description the second year of the university somebody started a study on the romant

light_oj 1356 素数独立集,二分图最大独立集

light_oj 1356 素数独立集,二分图最大独立集 B - Prime Independence Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1356 Description A set of integers is called prime independent if none of its member is a pr

[luoguP3355] 骑士共存问题(二分图最大独立集)

传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建立附加源S汇T,从S向X集合中每个顶点连接一条容量为1的有向边,从Y集合中每个顶点向T连接一条容量为1的有向边. 从每个可用的黑色格子向骑士一步能攻击到的可用的白色格子连接一条容量为无穷大的有向边. 求出网络最大流,要求的结果就是可用格子的数量减去最大流量. 分析 用网络流的方法解决棋盘上的问题,一

hdu1068 Girls and Boys,二分图最大独立集

点击打开链接 二分图最大独立集 = 顶点数 - 最大匹配数 #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1005; int g[maxn][maxn]; int n; int link[maxn]; bool used[maxn

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

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