我是靠谱客的博主 热情月亮,最近开发中收集的这篇文章主要介绍CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:http://codeforces.com/contest/655/problem/D

大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系。

解法是二分答案,利用拓扑排序看是否所有关系被唯一确定。即任意一次只能有1个元素入度为0入队。

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <string>
 5 #include <string.h>
 6 #include <stdio.h>
 7 #include <math.h>
 8 #include <queue>
 9 #include <stack>
10 #include <map>
11 #include <set>
12
13 using namespace std;
14
15
16 const int N=123456;
17
18 struct Edge {
19
int to,next;
20 
Edge() {}
21
Edge(int _to,int _nxt):to(_to),next(_nxt) {}
22 } edge[N<<2];
23 int idx=1,head[N];
24 void addedge(int u,int v) {
25
edge[++idx]=Edge(v,head[u]);
26
head[u]=idx;
27 }
28 int in[N],que[N];
29
30 int a[N],b[N];
31
32 bool topoSort(int n,int mid){
33
idx=1;memset(head,0,sizeof head);
34
memset(in,0,sizeof in);
35
for (int i=1;i<=mid;i++) {
36 
addedge(a[i],b[i]);
37
in[b[i]]++;
38 
}
39
int tail=0;
40
for (int i=1;i<=n;i++)
41
if (in[i]==0)
42
que[tail++]=i;
43
if (tail>1) return false;
44
for (int i=0;i<tail;i++){
45
int cnt=0;
46
for (int k=head[que[i]];k;k=edge[k].next){
47
int v=edge[k].to;
48
in[v]--;
49
if (in[v]==0){
50
cnt++;
51
if (cnt>1) return false;
52
que[tail++]=v;
53 
}
54 
}
55 
}
56
return true;
57 }
58
59
60 int main() {
61
int n,m;
62
scanf("%d %d",&n,&m);
63
for (int i=1;i<=m;i++) {
64
scanf("%d %d",a+i,b+i);
65 
}
66
int low=1,high=m,ret=-1;
67
while (low<=high) {
68
int mid=(low+high)>>1;
69
if (topoSort(n,mid)) {
70
ret=mid;
71
high=mid-1;
72 
}
73
else
74
low=mid+1;
75 
}
76
printf("%dn",ret);
77
return 0;
78 }
View Code

 

转载于:https://www.cnblogs.com/micrari/p/5385263.html

最后

以上就是热情月亮为你收集整理的CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序的全部内容,希望文章能够帮你解决CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部