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就行了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<vector>
  6. using namespace std;
  7. #define MAXN 3100
  8. #define MAXV MAXN
  9. #define MAXE 11000000
  10. struct Edge
  11. {
  12. int np;
  13. Edge *next;
  14. }E[MAXE],*V[MAXV];
  15. int tope=-;
  16. void addedge(int x,int y)
  17. {
  18. E[++tope].np=y;
  19. E[tope].next=V[x];
  20. V[x]=&E[tope];
  21. }
  22. vector<int> blst[MAXN];
  23. int a[MAXN],b[MAXN];
  24. int vis[MAXN],vistime;
  25. int ptr[MAXN];
  26. bool find(int now)
  27. {
  28. if (vis[now]==vistime)return false;
  29. vis[now]=vistime;
  30. Edge *ne;
  31. for (ne=V[now];ne;ne=ne->next)
  32. {
  33. if (ptr[ne->np]==- || find(ptr[ne->np]))
  34. {
  35. ptr[ne->np]=now;
  36. return true;
  37. }
  38. }
  39. return false;
  40. }
  41. int work(vector<int> seq)
  42. {
  43. for (int i=;i<seq.size();i++)ptr[seq[i]]=-;
  44. for (int i=;i<seq.size();i++)
  45. {
  46. for (int j=i+;j<seq.size();j++)
  47. {
  48. if (((b[seq[i]]^b[seq[j]])&) && !__builtin_parity(b[seq[i]]|b[seq[j]]))
  49. {
  50. addedge(seq[i],seq[j]);
  51. addedge(seq[j],seq[i]);
  52. }
  53. }
  54. }
  55. int ret=;
  56. for (int i=;i<seq.size();i++)
  57. {
  58. if ((b[seq[i]]&))
  59. {
  60. ++vistime;
  61. ret+=find(seq[i]);
  62. }
  63. }
  64. ret=seq.size()-ret;
  65. for (int i=;i<seq.size();i++)V[seq[i]]=;tope=-;
  66. return ret;
  67. }
  68.  
  69. int ans=;
  70. int main()
  71. {
  72. freopen("input.txt","r",stdin);
  73. freopen("output.txt","w",stdout);
  74. int n,m,q;
  75. int x,y;
  76. vector<int> seq;
  77. scanf("%d%d",&n,&m);
  78. scanf("%d",&q);
  79. for (int i=;i<=n;i++)
  80. scanf("%d",a+i);
  81. for (int i=;i<=m;i++)
  82. scanf("%d",b+i);
  83. for (int i=;i<=n;i++)blst[i].clear();
  84. for (int i=;i<=q;i++)
  85. {
  86. scanf("%d%d",&x,&y);
  87. blst[x].push_back(y);
  88. }
  89. for (int i=;i<=n;i++)
  90. {
  91. sort(blst[i].begin(),blst[i].end());
  92. blst[i].erase(unique(blst[i].begin(),blst[i].end()),blst[i].end());
  93. }
  94. //Nothing In A
  95. for (int i=;i<=m;i++)seq.push_back(i);
  96. ans=max(ans,work(seq));
  97. seq.clear();
  98. for (int i=;i<=n;i++)
  99. {
  100. for (int j=;j<blst[i].size();j++)
  101. seq.push_back(blst[i][j]);
  102. if (seq.size()+>ans)
  103. ans=max(ans,work(seq)+);
  104. seq.clear();
  105. }
  106. for (int i=;i<=n;i++)
  107. {
  108. for (int j=i+;j<=n;j++)
  109. {
  110. if (!((a[i]^a[j])&))continue;
  111. vector<int> :: iterator it1,it2;
  112. it1=blst[i].begin();
  113. it2=blst[j].begin();
  114. while (it1!=blst[i].end() && it2!=blst[j].end())
  115. {
  116. if (*it1==*it2)
  117. {
  118. seq.push_back(*it1);
  119. it1++,it2++;
  120. }else if (*it1<*it2)
  121. {
  122. it1++;
  123. }else
  124. {
  125. it2++;
  126. }
  127. }
  128. if (seq.size()+>ans)
  129. ans=max(ans,work(seq)+);
  130. seq.clear();
  131. }
  132. }
  133. printf("%d\n",ans);
  134. }

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. UpdatePanel中执行js

    在UpdatePanel中,直接使用Page.ClientScript.RegisterStartupScript的方式执行javascript,会导致无法执行.原因可能是因为RegisterStar ...

  2. vs2010打包winform程序详解

    vs2010打包winform程序详解   最近一直在做winform程序,做完后程序打包很头疼,第三方打包工具,好用的花钱,不花钱的不好用,最后只能用vs自带的打包工具了! 打包过程vs2010(包 ...

  3. ifndef/define/endif作用和用法

    问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它~~高手请指点一下~~谢谢~~~!!! ------------- ...

  4. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  5. iOS常用的设计模式

    iOS常用的设计模式有:单例模式.委托模式.观察者模式和MVC模式.下面分别简单介绍. 一:单例模式 我们常用的UIApplication.NSUserdefaults.NSNotificationC ...

  6. jQuery中的getter和setter方法

    1.attr()方法是jQuery中用于HTML属性的getter/setter.一个相关函数是removeAttr(). 2.css()方法和attr()方法很类似,只是css()方法作用于元素的c ...

  7. Jquery实现搜索框提示功能

    博客的前某一篇文章中http://www.cnblogs.com/hEnius/p/2013-07-01.html写过一个用Ajax来实现一个文本框输入的提示功能.最近在一个管理项目的项目中,使用后发 ...

  8. 【解惑】深入jar包:从jar包中读取资源文件

    [解惑]深入jar包:从jar包中读取资源文件 http://hxraid.iteye.com/blog/483115 TransferData组件的spring配置文件路径:/D:/develop/ ...

  9. Winform的窗体美化心酸路

    我想做一位狂热的程序猿粪子! 其实一直都很想做点什么,工作原因林林种种导致停止了前进的脚步. 有时会为自己的一个目标狂热,但经常发觉激情过后更多的总是为自己找借口! 最近感觉奔三将近.逐有感而发,不能 ...

  10. chorme模拟微信浏览器

    chorme模拟微信浏览器 1.代码填入到图中2出 Mozilla/5.0 (Linux; Android 4.4.4; HM NOTE 1LTEW Build/KTU84P) AppleWebKit ...