题目大概说n个学生,都各自有一个互不相同的成绩排名,他们各自说了他们成绩排名所在区间,问最多有几个学生没说谎以及字典序最大的没说谎的学生序列。

学生作为一个X部的点,排名作为Y部的点,学生与其成绩排名的区间的各个点之间连边,这其实就是求这个二分图的最大匹配。

排名最多10W,边容量为1,不离散化跑网络流(Dinic?!)好像应该也是没问题的。。不过还是学习了别人的离散化,自己写的错了。。

这题关键是要字典序最大,不会。。又学习了别人的写法——按字典序枚举学生,加相关边,依次跑最大流。好有道理!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. #define INF (1<<30)
  7. #define MAXN 444
  8. #define MAXM 444*444*2
  9. struct Edge{
  10. int flag,v,cap,flow,next;
  11. }edge[MAXM];
  12. int vs,vt,NV,NE,head[MAXN];
  13. void addEdge(int u,int v,int cap,int flag){
  14. edge[NE].flag=flag;
  15. edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
  16. edge[NE].next=head[u]; head[u]=NE++;
  17. edge[NE].flag=flag;
  18. edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
  19. edge[NE].next=head[v]; head[v]=NE++;
  20. }
  21. int level[MAXN];
  22. int gap[MAXN];
  23. void bfs(){
  24. memset(level,-,sizeof(level));
  25. memset(gap,,sizeof(gap));
  26. level[vt]=;
  27. gap[level[vt]]++;
  28. queue<int> que;
  29. que.push(vt);
  30. while(!que.empty()){
  31. int u=que.front(); que.pop();
  32. for(int i=head[u]; i!=-; i=edge[i].next){
  33. int v=edge[i].v;
  34. if(level[v]!=-) continue;
  35. level[v]=level[u]+;
  36. gap[level[v]]++;
  37. que.push(v);
  38. }
  39. }
  40. }
  41. int pre[MAXN];
  42. int cur[MAXN];
  43. int ISAP(){
  44. bfs();
  45. memset(pre,-,sizeof(pre));
  46. memcpy(cur,head,sizeof(head));
  47. int u=pre[vs]=vs,flow=,aug=INF;
  48. gap[]=NV;
  49. while(level[vs]<NV){
  50. bool flag=false;
  51. for(int &i=cur[u]; i!=-; i=edge[i].next){
  52. int v=edge[i].v;
  53. if(edge[i].cap!=edge[i].flow && level[u]==level[v]+){
  54. flag=true;
  55. pre[v]=u;
  56. u=v;
  57. aug=min(aug,edge[i].cap-edge[i].flow);
  58. if(v==vt){
  59. flow+=aug;
  60. for(u=pre[v]; v!=vs; v=u,u=pre[u]){
  61. edge[cur[u]].flow+=aug;
  62. edge[cur[u]^].flow-=aug;
  63. }
  64. aug=INF;
  65. }
  66. break;
  67. }
  68. }
  69. if(flag) continue;
  70. int minlevel=NV;
  71. for(int i=head[u]; i!=-; i=edge[i].next){
  72. int v=edge[i].v;
  73. if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
  74. minlevel=level[v];
  75. cur[u]=i;
  76. }
  77. }
  78. if(--gap[level[u]]==) break;
  79. level[u]=minlevel+;
  80. gap[level[u]]++;
  81. u=pre[u];
  82. }
  83. return flow;
  84. }
  85. int x[],y[],point[],pn;
  86. int idx[];
  87. int main(){
  88. int t,n;
  89. scanf("%d",&t);
  90. while(t--){
  91. scanf("%d",&n);
  92. pn=;
  93. int mx=;
  94. for(int i=; i<=n; ++i){
  95. scanf("%d%d",x+i,y+i);
  96. point[pn++]=x[i];
  97. point[pn++]=++y[i];
  98. }
  99. sort(point,point+pn);
  100. pn=unique(point,point+pn)-point;
  101. vs=; vt=pn+n; NV=vt+; NE=;
  102. memset(head,-,sizeof(head));
  103. for(int i=; i<pn; ++i){
  104. addEdge(i,vt,point[i]-point[i-],);
  105. for(int j=; j<=n; ++j){
  106. if(x[j]<=point[i-] && point[i]<=y[j]) addEdge(j+pn-,i,,);
  107. }
  108. }
  109. int flow=;
  110. for(int i=n; i>=; --i){
  111. addEdge(vs,i+pn-,,i);
  112. flow+=ISAP();
  113. }
  114. printf("%d\n",flow);
  115. int ans[],an=;
  116. for(int i=head[vs]; i!=-; i=edge[i].next){
  117. if(edge[i].cap==edge[i].flow && edge[i].flag) ans[an++]=edge[i].flag;
  118. }
  119. sort(ans,ans+an);
  120. for(int i=; i<an; ++i){
  121. if(i) putchar(' ');
  122. printf("%d",ans[i]);
  123. }
  124. putchar('\n');
  125. }
  126. return ;
  127. }

HDU3729 I'm Telling the Truth(字典序最大的最大流)的更多相关文章

  1. hdu3729 I'm Telling the Truth (二分图的最大匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS (Java/ ...

  2. HDU-3729 I'm Telling the Truth

    一个点集是学生,一个点集是排名.然后通过学生的排名范围连线,求此二分图的最大匹配. 本题还要求是最大字典序输出,那么由贪心可得,你让标号从大到小找增广边就行了. #include <cstdli ...

  3. hdu 3729 I'm Telling the Truth(二分匹配_ 匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS ( ...

  4. UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)

    I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  5. I'm Telling the Truth(二分图)

    .I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  6. 二分图的最大匹配-hdu-3729-I'm Telling the Truth

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3729 题目意思: 有n个学生,老师询问每个学生的排名,每个学生都告诉了一个排名区间,求可能的最多的学 ...

  7. HDU 3729 I&#39;m Telling the Truth(二部图最大匹配+结果输出)

    职务地址:HDU 3729 二分图最大匹配+按字典序输出结果. 仅仅要从数字大的開始匹配就能够保证字典序最大了.群里有人问. . 就顺手写了这题. . 代码例如以下: #include <ios ...

  8. 【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

    思路 题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大. 思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博 ...

  9. HDU - 3729 I'm Telling the Truth(二分匹配)

    题意:有n个人,每个人给出自己的名次区间,问最多有多少个人没撒谎,如果有多解,输出字典序最大的解. 分析: 1.因为字典序最大,所以从后往前分析. 2.假设后面的人没说谎,并将此作为已知条件,然后从后 ...

随机推荐

  1. FrameSize、WinSize、VisibleSize、VisibleOrigin区别

    FrameSize 手机屏幕分辨率,通过CCEGLView::sharedOpenGLView()->getFrameSize()获得,不同的分辨率手机这个值不同 WinSize 设计分辨率,固 ...

  2. [Effective JavaScript 笔记] 第1章:让自己习惯javascript小结

    在这里整理一下,每条对应的提示 第1条:了解使用的js版本 确定应用程序支持的js的版本(浏览器也是应用程序噢) 确保使用的js特性是应用程序支持的(要不写了也运行不了) 总是在严格模式下编写和测试代 ...

  3. Delphi与C语言类型转换对照

    When converting C function prototypes to Pascal equivalent declarations, it's important to substitut ...

  4. poj 3020 最短路径覆盖 Antenna Placement

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7329   Accepted: 3635 ...

  5. poj1258 Agri-Net 最小生成树

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44032   Accepted: 18001 Descri ...

  6. 代码风格与树形DP

    Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...

  7. Linux shell判断文件和文件夹是否存在

    shell判断文件,目录是否存在或者具有权限 #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/acc ...

  8. 修改setup.py的源

    方法一: 修改文件 ~/.pydistutils.cfg为: [easy_install] index_url = http://pypi.douban.com/simple 方法二: 直接在setu ...

  9. mysql lower,upper实现大小写

    mysql的lower和uppper函数可以将指定字符串转换为小写和大写 select lower('OutSpringTd') as lowerCase, upper('OutSpringTd') ...

  10. 在windows下用cygwin和eclipse搭建cocos2dx的android开发环境

    在windows下用cygwin和eclipse搭建cocos2dx(2.1.4)的android开发环境,2013-8-1更新. 一.准备工作 需要下载和安装以下内容,请根据自己的操作系统选择x86 ...