直接连接每一个孩子和他们所描述的区间的每一个点,然后做一次最大匹配(因为要说谎的人最少),做的时候要倒着做,因为要最大方案,然后出来检查一下每一个点是否为匹配点,保存一下输出就好了。

#include <cstdio>
#include <cstring>
#include <algorithm>
//#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100060;
bool vis[MAXN+10];
int con[MAXN+10];
int endcnt;
int n, m;
struct node{int v;node *next;
}Edges[60 * 100000 * 2+10], *adj[MAXN+10], *ecnt=Edges;
void addedge(int u, int v){++ecnt;ecnt->v = v;ecnt->next = adj[u];adj[u] = ecnt;
}
bool dfs(int u){for(node *p=adj[u];p;p=p->next){if(!vis[p->v]){vis[p->v] = true;if(con[p->v]==-1 || dfs(con[p->v])){con[u] = p->v;con[p->v] = u;return true;}}}return false;
}
void work(){int ret = 0;memset(con, -1, sizeof con);for(int i=endcnt;i>=1;i--) if(con[i] == -1){memset(vis, 0, sizeof vis);ret += dfs(i);if(ret == n) break;}vector<int> ans;for(int i=1;i<=n;i++) if(con[i] != -1 && con[con[i]] == i){ans.push_back(i);}printf("%d\n", ret);printf("%d", ans[0]);for(int i=1;i<ans.size(); i++) printf(" %d", ans[i]);puts("");
}
void read(){int t1, t2;scanf("%d", &n);for(int i=1;i<=n;i++){scanf("%d%d", &t1, &t2);for(int j=t1; j<=t2; j++){addedge(i, j+n);addedge(j+n, i);}}endcnt=n;
}
int main(){int T;scanf("%d", &T);while(T--){read();work();memset(adj, 0, sizeof adj);ecnt=Edges;}return 0;
}

转载于:https://www.cnblogs.com/JeremyGJY/p/5921672.html

【图论】【二分图匹配】[POJ 3041]I'm Telling the Truth相关推荐

  1. POJ 3041 Asteroids (对偶性,二分图匹配)

    题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...

  2. NOI图论算法:二分图匹配

    二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 https://www.bilibili.com/video/BV1j5411x7PU SWPU-ACM每周算法讲堂-匈牙利算法 ...

  3. 算法讲解:二分图匹配【图论】

    二分图匹配,自然要先从定义入手,那么二分图是什么呢? 二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每 ...

  4. POJ 2724 Purifying Machine (二分图匹配)

    题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个 ...

  5. 【Step1】【二分图匹配】poj 1274-The Perfect Stall

    题目链接 题目大意 输入数据中,第一行给出n,表示n个奶牛. 接下来n行,每行一个x,xi表示第i头奶牛可以选择x个谷仓中的一个进行匹配.接下来x个数,表示谷仓的编号(1~n之间) 一个谷仓也只能有一 ...

  6. I'm Telling the Truth(二分图匹配)

    原题 题意: 有n个学生,你想了解他们的成绩.每个人告诉你他们的名次区间在x~y之间(闭区间),你需要判断最多说真话的人数,并输出这些人的编号,多种情况时输出最大字典序的一组 思路 该题目乍一看像并查 ...

  7. 算法:ACM二分图匹配 HDU2063

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 摘录于互联网,原创作者redraiment,很详细的二分图匹配入门资料! 2063 过山车 Pr ...

  8. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  9. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  10. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

最新文章

  1. ES6--基础语法(一)
  2. 基于Keras的LSTM多变量时间序列预测
  3. ubuntu18安装32位库
  4. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信
  5. String常用的方法总结
  6. 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)
  7. 内联命名空间(inline namespace)
  8. 小甲鱼python课后题简书_Python练习题100道
  9. 如何在微信公众帐号开发模式下,通过程序代码向用户发送符号表情。
  10. 借攻防演习提升企业安全能力
  11. 招聘数下降71%!程序员:你的努力正在毁掉自己!
  12. oracle重置口令是什么意思,Oracle重置数据库命令
  13. IOMeter存储测试工具
  14. 2019年美国大联盟美国总决赛小学组获奖牌名单
  15. directadmin(DirectAdmin Extended)
  16. 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
  17. 5分钟学会Pixel刷机
  18. Android 网页无法访问
  19. js 原生将元素插入到父元素首位,jquery和原生两种方式
  20. 【华人学者风采】刘小平 中山大学

热门文章

  1. java画图类_JAVA绘图类_Graphics
  2. ue4服务器稳定性,ue4 客户端 服务器
  3. 贝叶斯概率推断(一):贝叶斯思维
  4. 翻译:生产中的机器学习:为什么你应该关心数据和概念漂移
  5. android 扩展textview,Android可收缩/扩展的TextView【1】
  6. oracle 7302,无法创建链接服务器XXXXX的OLEDB访问接口OraOLEDBOracle的实例。(MicrosoftSQLServer,错误7302)...
  7. python中提交post表单_python接口自动化二(发送post请求)
  8. c++关于函数的参数传递全部知识点详解
  9. 【机器学习】Cross-Validation(交叉验证)详解
  10. 天池客流预测–GBDT