bzoj 2744: [HEOI2012]朋友圈 二分图匹配
2744: [HEOI2012]朋友圈
Time Limit: 30 Sec Memory Limit: 128 MB
Submit: 612 Solved: 174
[Submit][Status][Discuss]
Description
S∈A∪ B ,对于所有的i,j∈ S,i和 j 是朋友
由于落后的古代,没有电脑这个也就成了每年最大的难题,而你能帮他们求出最大朋友圈的人数吗?
Input
Output
Sample Input
1 2
2 6 5 4
1 1
1 2
1 3
2 1
2 2
2 3
2 4
Sample Output
【样例说明】
最大朋友圈包含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]朋友圈 二分图匹配的更多相关文章
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- bzoj2744 [HEOI2012]朋友圈——二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 首先,求一个图的最大团等价于求它的补图的最大独立集,而二分图的最大独立集 = 总点数 ...
- bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...
- bzoj 2744: [HEOI2012]朋友圈
#include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...
- 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)
2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...
- 【BZOJ 2744 】[HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- BZOJ2744 HEOI2012朋友圈(二分图匹配)
先考虑B国.容易发现a xor b mod 2=0即二进制末位相同,那么可以据此将所有人分成两部分,每一部分各自是一个完全图.然后再将a or b有奇数个1的边连上,现在需要求的就是这样一个图里的最大 ...
- 【二分图】HEOI2012 朋友圈
题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...
- luogu P2423 [HEOI2012]朋友圈 (最大团)
在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...
随机推荐
- HDOJ2014青年歌手大奖赛_评委会打分
青年歌手大奖赛_评委会打分 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- win10下怎么在桌面创建IIS快捷方式
在电脑上打开C:\Windows\System32\inetsrv,在里面找到InetMgr.exe,如图 2 右击InetMgr.exe会发现没有发送到桌面的选项,所以我们选择创建快捷方式,如图 3 ...
- Java之绘制五环图案
前面已经介绍过绘制方法.这里不再赘述. package com.caiduping; import java.awt.BasicStroke; import java.awt.Color; impor ...
- NDIS IM 驱动那些事情
最近不知道为什么开始学习windows NDIS驱动开发,用的是寒江独钓的例子,其实他的改的代码也就一点点,说的有用的东西也就那么多,不过还是感谢他出了这么一本书,不然这真的就没有一本稍微好一点的书籍 ...
- ios Swift ! and ?
swift ?和!之间区别: Swift 引入的最不一样的可能就是 Optional Value 了.在声明时,我们可以通过在类型后面加一个? 来将变量声明为 Optional 的.如果不是 Opti ...
- Swift静态方法
与静态属性类似,Swift中还定义了静态方法,也称为类型方法,所谓“类型”是指枚举.结构体和类.静态方法定义的方法也是与静态属性类似的,枚举和结构体的静态方法使用的关键字是static,类的静态方法使 ...
- iOS 网络 -- cocoaPods 安装和使用教程
Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage CocoaPods 是什么? 当你开发iOS应用时, ...
- OC1_点语法
// // Dog.h // OC1_点语法 // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 zhangxueming ...
- C/C++中浮点数格式学习——以IEEE75432位单精度为例
这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...
- 隐藏win7盘符
1.隐藏盘符: //新建注册表,隐藏X盘符 int regeditme() { HKEY hkey; DWORD dwLastError= ;//隐藏X盘2^25 J:2^9=512 X:盘符与挂载的 ...