【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
PROBLEM
题目描述
Farmer John's N cows (1≤N≤105), numbered 1…N as always, happen to have too much time on their hooves. As a result, they have worked out a complex social hierarchy related to the order in which Farmer John milks them every morning.
After weeks of study, Farmer John has made M observations about his cows' social structure (1≤M≤50,000). Each observation is an ordered list of some of his cows, indicating that these cows should be milked in the same order in which they appear in this list. For example, if one of Farmer John's observations is the list 2, 5, 1, Farmer John should milk cow 2 sometime before he milks cow 5, who should be milked sometime before he milks cow 1.
Farmer John's observations are prioritized, so his goal is to maximize the value of X for which his milking order meets the conditions outlined in the first X observations. If multiple milking orders satisfy these first X conditions, Farmer John believes that it is a longstanding tradition that cows with lower numbers outrank those with higher numbers, so he would like to milk the lowest-numbered cows first. More formally, if multiple milking orders satisfy these conditions, Farmer John would like to use the lexicographically smallest one. An ordering x is lexicographically smaller than an ordering y if for some j, xi=yi for all i<j and xj<yj (in other words, the two orderings are identical up to a certain point, at which x is smaller than yy).
Please help Farmer John determine the best order in which to milk his cows.
输入
The first line contains N and M. The next M lines each describe an observation. Line i+1 describes observation i, and starts with the number of cows mi listed in the observation followed by the list of mimi integers giving the ordering of cows in the observation. The sum of the mi's is at most 200,000.
输出
Output N space-separated integers, giving a permutation of 1…N containing the order in which Farmer John should milk his cows.
样例输入
4 3
3 1 2 3
2 4 2
3 3 4 1
样例输出
1 4 2 3
提示
Here, Farmer John has four cows and should milk cow 1 before cow 2 and cow 2 before cow 3 (the first observation), cow 4 before cow 2 (the second observation), and cow 3 before cow 4 and cow 4 before cow 1 (the third observation). The first two observations can be satisfied simultaneously, but Farmer John cannot meet all of these criteria at once, as to do so would require that cow 1 come before cow 3 and cow 3 before cow 1.
This means there are two possible orderings: 1 4 2 3 and 4 1 2 3, the first being lexicographically smaller.
MEANING
给你n个点,m条链(边集),要求选前k条链,使得所有点和选择的边构成一个DAG,k要尽可能大,输出点的最小拓扑序。
SOLUTION
如果前k条链不能构成DAG,,那么k+1条链也不能构成DAG,因此k的取值在 \(k_{max}\)的左侧合法,右侧不合法 ,所以可以二分求k的最大值,对构成的图拓扑排序,即可判断图是否为DAG。
CODE
#define IN_PC() freopen("C:\\Users\\hz\\Desktop\\in.txt","r",stdin)
#define IN_LB() freopen("C:\\Users\\acm2018\\Desktop\\in.txt","r",stdin)
#define OUT_PC() freopen("C:\\Users\\hz\\Desktop\\out.txt","w",stdout)
#define OUT_LB() freopen("C:\\Users\\acm2018\\Desktop\\out.txt","w",stdout)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 100005;
int n, m;
priority_queue<int,vector<int>,greater<int> > pq;
vector<int> ans;
struct edge {
int v, w,nex;
} ed[MAXN * 4];
int in[MAXN],head[MAXN], cnt;
void addedge(int u, int v,int w) {
cnt++;
ed[cnt].v = v;
ed[cnt].w = w;
ed[cnt].nex = head[u];
head[u] = cnt;
}
bool judge(int num) {
for(int i=1;i<=n;i++)in[i] = 0;
for(int i=1;i<=n;i++){
for(int j = head[i];j;j=ed[j].nex){
if(ed[j].w<=num){
in[ed[j].v]++;
}
}
}
for(int i=1;i<=n;i++){
if(!in[i])pq.push(i);
}
ans.clear();
while(!pq.empty()){
int u = pq.top();
ans.push_back(u);
pq.pop();
for(int i=head[u];i;i=ed[i].nex){
int v = ed[i].v;
if(ed[i].w>num)continue;
in[v]--;
if(!in[v]){
pq.push(v);
}
}
}
return ans.size() == (unsigned)n;
}
int main() {
// IN_PC();
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int k,p,pre;
scanf("%d", &k);
for(int j = 0; j < k; j++) {
scanf("%d", &p);
if(j)addedge(pre,p,i);
pre = p;
}
}
int l = 0, r = m - 1;
while(l < r) {
int mid = (l + r +1) / 2;
if(judge(mid))
l = mid;
else r = mid - 1;
}
judge(l);
for(unsigned int i=0;i<ans.size();i++)printf("%s%d",i==0?"":" ",ans[i]);
printf("\n");
return 0;
}
【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348的更多相关文章
- codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序
题目链接 我们可以发现, 这是一个很明显的二分+拓扑排序.... 如何判断根据当前的点, 是否能构造出来一个唯一的拓扑序列呢. 如果有的点没有出现, 那么一定不满足. 如果在加进队列的时候, 同时加了 ...
- CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序
题目链接:http://codeforces.com/contest/655/problem/D 大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系. 解法是二分答案,利用拓扑排序看是 ...
- CodeForces - 1100E 二分+拓扑排序
题意: 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权. Inpu ...
- CROC 2016 - Elimination Round (Rated Unofficial Edition) D. Robot Rapping Results Report 二分+拓扑排序
D. Robot Rapping Results Report 题目连接: http://www.codeforces.com/contest/655/problem/D Description Wh ...
- Codeforces Round #532 (Div. 2) E. Andrew and Taxi(二分+拓扑排序)
题目链接:https://codeforces.com/contest/1100/problem/E 题意:给出 n 个点 m 条边的有向图,要翻转一些边,使得有向图中不存在环,问翻转的边中最大权值最 ...
- USACO 2016 US Open Contest, Gold解题报告
1.Splitting the Field http://usaco.org/index.php?page=viewproblem2&cpid=645 给二维坐标系中的n个点,求ans=用一个 ...
- 拓扑排序(三)之 Java详解
前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
- 拓扑排序(二)之 C++详解
本章是通过C++实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处:http://www.cnblogs. ...
- 拓扑排序(一)之 C语言详解
本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...
随机推荐
- Json对象处理.将对象处理成dic数组.
var parser = new JsonConfigurationFileParser();var dict = parser.Parse("json"); using Newt ...
- selenium相关:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI
1.实验 #https://captcha.luosimao.com/demo/ chrome default: location 不滚动,直接返回相对整个html的坐标 {'x': 15.0, 'y ...
- linux后台执行./run.py提示python syntax error near unexpected token `('
python脚本中的#!/usr/bin/python 估计有不少人注意过一些python脚本开头有这么行东东: #!/usr/bin/python 它是用来干嘛的?貌似没有它对脚本功能也没啥 ...
- spark操作Kudu之读 - 使用DataFrame API
虽然我们可以通过上面显示的KuduContext执行大量操作,但我们还可以直接从默认数据源本身调用读/写API. 要设置读取,我们需要为Kudu表指定选项,命名我们要读取的表以及为表提供服务的Kudu ...
- sparkStreaming消费kafka-1.0.1方式:direct方式(存储offset到Hbase)
话不多说,可以看上篇博文,关于offset存储到zookeeper https://www.cnblogs.com/niutao/p/10547718.html 本篇博文主要告诉你如何将offset写 ...
- day9.初始函数练习题
1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def new(args): a = [] for I in range(1,len(args),2) ...
- 学号:20165239 预备作业3 Linux安装及学习
实验三 用户及文件权限管理 之前从未接触过虚拟机,借着老师布置的任务,这次寒假初次接触了虚拟机,既紧张又兴奋,在学习了老师的一部分教程以及查阅网上的资料之后,有了以下的学习笔记和心得. 一.Linux ...
- Python3爬虫知识点总结
1.requests获取响应头的方法 eg:获取响应头信息 import requests res = request.head(url).headers print(res)
- nginx安装,运行(ubuntu)
文本只涉及单节点nginx 安装gcc g++依赖库 apt-get install build-essential apt-get install libtool 安装pcre依赖库 apt-get ...
- 【python】面向对象编程
No1: 类和实例 __init__方法的第一个参数永远是self,表示创建的实例本身:init相当于构造函数 No2: 数据封装 No3: 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下 ...