博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】
阅读量:4967 次
发布时间:2019-06-12

本文共 1415 字,大约阅读时间需要 4 分钟。

思路

题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大。

思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的,个人认为讲的比较清晰。

AC代码

#include
#include
#include
using namespace std;int T, n;struct Stue{ int l, r;};Stue per[60+10];int vis[100000+10]; //判断该点是否访问过int hon[60+10]; //用于记录未说谎的人的编号int ok[100000+10]; //标记某点存在的学生编号,未有则默认为-1bool dfs(int x){ if(x < 0) return false; for(int i = per[x].l; i <= per[x].r; i++) { if(!vis[i]) { vis[i] = 1; if(ok[i] == -1 || dfs(ok[i])) { ok[i] = x; return true; } } } return false;}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); cin >> T; while(T--) { cin >> n; for(int i = 0; i < n; i++) cin >> per[i].l >> per[i].r; int cnt = 0; memset(hon, 0, sizeof(hon)); memset(ok, -1, sizeof(ok)); for(int i = n - 1; i >= 0; i--) //从后往前,这样可以保证字典序最大 { memset(vis, 0, sizeof(vis)); if(dfs(i)) hon[cnt++] = i; } cout << cnt << endl; if(!cnt) continue; for(int i = cnt - 1; i > 0; i--) cout << hon[i] + 1 << " "; cout << hon[0] + 1 << endl; }}

转载于:https://www.cnblogs.com/KeepZ/p/11370841.html

你可能感兴趣的文章
我对应用软件——美团的看法
查看>>
执行了的程序,才是你的程序.
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
ubuntu16系统磁盘空间/dev/vda1占用满的问题
查看>>
grid网格布局
查看>>
JSP常用标签
查看>>
dashucoding记录2019.6.7
查看>>
九涯的第一次
查看>>
处理器管理与进程调度
查看>>
页面懒加载
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>