2744: [HEOI2012]朋友圈

Time Limit: 30 Sec  Memory Limit: 128 MB
Submit: 612  Solved: 174
[Submit][Status][Discuss]

Description

在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着。一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目。
两个国家看成是AB两国,现在是两个国家的描述:
1.         A国:每个人都有一个友善值,当两个A国人的友善值a、b,如果a xor b mod 2=1,
那么这两个人都是朋友,否则不是;
2.         B国:每个人都有一个友善值,当两个B国人的友善值a、b,如果a xor b mod 2=0
或者 (a or b)化成二进制有奇数个1,那么两个人是朋友,否则不是朋友;
3.         A、B两国之间的人也有可能是朋友,数据中将会给出A、B之间“朋友”的情况。
4.     在AB两国,朋友圈的定义:一个朋友圈集合S,满足

S∈A∪ B                  ,对于所有的i,j∈  S,i和       j   是朋友

由于落后的古代,没有电脑这个也就成了每年最大的难题,而你能帮他们求出最大朋友圈的人数吗?

Input

第一行t<=6,表示输入数据总数。
接下来t个数据:
第一行输入三个整数A,B,M,表示A国人数、B国人数、AB两国之间是朋友的对数;第二行A个数ai,表示A国第i个人的友善值;第三行B个数bi,表示B国第j个人的友善值;
第4——3+M行,每行两个整数(i,j),表示第i个A国人和第j个B国人是朋友。

Output

 
输出t行,每行,输出一个整数,表示最大朋友圈的数目。

Sample Input

2 4 7
1 2
2 6 5 4
1 1
1 2
1 3
2 1
2 2
2 3
2 4

Sample Output

5
【样例说明】
最大朋友圈包含A国第1、2人和B国第1、2、3人。

HINT

【数据范围】

两类数据

第一类:|A|<=200 |B| <= 200

第二类:|A| <= 10 |B| <= 3000

  说实话这个数据范围我并不会正解,但是这道题,枚举A过的点(最多两个),对B国跑匈牙利是可以过的,只是提醒一个坑:出题人貌似专门卡了匈牙利,如果TLE掉了试一试换一个集合调用find函数。原来我在b[i]%2==0时调用find(i)TLE,然后换成b[i]%2==1就行了。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
#define MAXN 3100
#define MAXV MAXN
#define MAXE 11000000
struct Edge
{
int np;
Edge *next;
}E[MAXE],*V[MAXV];
int tope=-;
void addedge(int x,int y)
{
E[++tope].np=y;
E[tope].next=V[x];
V[x]=&E[tope];
}
vector<int> blst[MAXN];
int a[MAXN],b[MAXN];
int vis[MAXN],vistime;
int ptr[MAXN];
bool find(int now)
{
if (vis[now]==vistime)return false;
vis[now]=vistime;
Edge *ne;
for (ne=V[now];ne;ne=ne->next)
{
if (ptr[ne->np]==- || find(ptr[ne->np]))
{
ptr[ne->np]=now;
return true;
}
}
return false;
}
int work(vector<int> seq)
{
for (int i=;i<seq.size();i++)ptr[seq[i]]=-;
for (int i=;i<seq.size();i++)
{
for (int j=i+;j<seq.size();j++)
{
if (((b[seq[i]]^b[seq[j]])&) && !__builtin_parity(b[seq[i]]|b[seq[j]]))
{
addedge(seq[i],seq[j]);
addedge(seq[j],seq[i]);
}
}
}
int ret=;
for (int i=;i<seq.size();i++)
{
if ((b[seq[i]]&))
{
++vistime;
ret+=find(seq[i]);
}
}
ret=seq.size()-ret;
for (int i=;i<seq.size();i++)V[seq[i]]=;tope=-;
return ret;
} int ans=;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,m,q;
int x,y;
vector<int> seq;
scanf("%d%d",&n,&m);
scanf("%d",&q);
for (int i=;i<=n;i++)
scanf("%d",a+i);
for (int i=;i<=m;i++)
scanf("%d",b+i);
for (int i=;i<=n;i++)blst[i].clear();
for (int i=;i<=q;i++)
{
scanf("%d%d",&x,&y);
blst[x].push_back(y);
}
for (int i=;i<=n;i++)
{
sort(blst[i].begin(),blst[i].end());
blst[i].erase(unique(blst[i].begin(),blst[i].end()),blst[i].end());
}
//Nothing In A
for (int i=;i<=m;i++)seq.push_back(i);
ans=max(ans,work(seq));
seq.clear();
for (int i=;i<=n;i++)
{
for (int j=;j<blst[i].size();j++)
seq.push_back(blst[i][j]);
if (seq.size()+>ans)
ans=max(ans,work(seq)+);
seq.clear();
}
for (int i=;i<=n;i++)
{
for (int j=i+;j<=n;j++)
{
if (!((a[i]^a[j])&))continue;
vector<int> :: iterator it1,it2;
it1=blst[i].begin();
it2=blst[j].begin();
while (it1!=blst[i].end() && it2!=blst[j].end())
{
if (*it1==*it2)
{
seq.push_back(*it1);
it1++,it2++;
}else if (*it1<*it2)
{
it1++;
}else
{
it2++;
}
}
if (seq.size()+>ans)
ans=max(ans,work(seq)+);
seq.clear();
}
}
printf("%d\n",ans);
}

bzoj 2744: [HEOI2012]朋友圈 二分图匹配的更多相关文章

  1. 【刷题】BZOJ 2744 [HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  2. bzoj2744 [HEOI2012]朋友圈——二分图匹配

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 首先,求一个图的最大团等价于求它的补图的最大独立集,而二分图的最大独立集 = 总点数 ...

  3. bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...

  4. bzoj 2744: [HEOI2012]朋友圈

    #include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...

  5. 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)

    2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...

  6. 【BZOJ 2744 】[HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  7. BZOJ2744 HEOI2012朋友圈(二分图匹配)

    先考虑B国.容易发现a xor b mod 2=0即二进制末位相同,那么可以据此将所有人分成两部分,每一部分各自是一个完全图.然后再将a or b有奇数个1的边连上,现在需要求的就是这样一个图里的最大 ...

  8. 【二分图】HEOI2012 朋友圈

    题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...

  9. luogu P2423 [HEOI2012]朋友圈 (最大团)

    在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...

随机推荐

  1. Forms身份认证

    引言 大家都知道Http是无状态的协议,所以访问一个url,你并不能知道用户在之前是否已经登陆过.但是许多业务上的逻辑又离不开user的信息,这个时候就可以借助身份认证来记录当前user的登录状态.这 ...

  2. hive创建表带中文注释报错解决方法

    hive创建带有中文注释的表报错: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask ...

  3. Android简单拨号

    package com.example.phonecall; import android.net.Uri; import android.os.Bundle; import android.app. ...

  4. C#学习笔记之线程 - 通知Signal

    通知事件等待句柄 Signal With EventWaitHandle 事件等待句柄常用于通知.当一个线程等待直到接收到另外一个线程发出的信号.事件等待句柄是最简单的信号结构,它与C#事件无关.有三 ...

  5. Amoeba For MySQL入门:实现数据库水平切分

    当系统数据量发展到一定程度后,往往需要进行数据库的垂直切分和水平切分,以实现负载均衡和性能提升,而数据切分后随之会带来多数据源整合等等问题.如果仅仅从应用程序的角度去解决这类问题,无疑会加重应用程度的 ...

  6. 第一节 Hibernate 基本配置

    1 新建maven工程 1)打开eclipse,依次点击File---->New---->Maven Project. 2)选择org.apache.maven.archetypes ma ...

  7. spring读取prperties配置文件(2)

    接上篇,spring读取prperties配置文件(1),这一篇主要讲述spring如何用annotation的方式去读取自定义的配置文件. 这里我先定义好属性文件"user.propert ...

  8. Codevs 5126 推销员 2015年NOIP全国联赛普及组

    5126 推销员 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死 ...

  9. [GeekBand] STL与泛型编程(2)

    本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...

  10. (POJ 3694) Network 求桥个数

    题目链接:http://poj.org/problem?id=3694Description A network administrator manages a large network. The ...