题意:

一个n个节点的有向图,节点标号从1到n,存在m条单向边。每条单向边有一个权值,代表翻转其方向所需的代价。求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权。

Input

单组输入,第一行包含两个整数n和m(2≤n≤100 000,1≤m≤100 000) 接下来m行,每行3个整数,u_i ,v_i,w_i (1<= u_i , v_i <= n, 1<= w_i <=10^9),表示u到v有一条权值为w的道路。道路编号从1开始。没有自环。

Output

在第一行中输出两个整数,即要翻转的最大的边权,和需要反转道路数量k。k不需要是最小的。

在下一行输出k个由空格分隔的整数,表示需要翻转的道路编号

如果有许多解决方案,请打印其中任何一个。

题解:

这是一个通过拓扑来使一个图变成无环图的相关链接:https://www.geeksforgeeks.org/assign-directions-to-edges-so-that-the-directed-graph-remains-acyclic/

这个链接的结论就是如果一个有向图图是一个无环图,那么对于每一条有向边<x,y>,点x在拓扑排序的结构中的位置肯定要比y靠前,就像下面这个图

回归本题,我们可以二分枚举那个最大的权值,那么小于这个权值的边都可以看做为无向边(就当作这些边都不存在),对剩下的边进行一次拓扑排序。然后这n个点就会有一个顺序,之后就根据上面的那个结论来判断这些无向边的指向应该怎么指才不会构成有环图,如果边的指向和题上输入的相反就记录一下输出

代码:

 1 #include <cstdio>
2 #include <cstring>
3 #include <cctype>
4 #include<queue>
5 #include<vector>
6 #include<iostream>
7 #include <algorithm>
8 using namespace std;
9 const int maxn=1e5+10;
10 typedef long long LL;
11 const int MAX=1e5+10;
12 const int MOD=1e9+7;
13 const int INF=1e9+7;
14 typedef long long ll;
15 struct lenka{int x,y,z;}ed[MAX];
16 vector<int>e[MAX];
17 vector<int>QAQ;
18 int top[MAX],in[MAX];
19 int n,m;
20 int check(int QWQ)
21 {
22 for(int i=1;i<=n;i++)e[i].clear();
23 memset(in,0,sizeof in);
24 for(int i=1;i<=m;i++)
25 {
26 if(ed[i].z>QWQ)
27 {
28 e[ed[i].x].push_back(ed[i].y);
29 ++in[ed[i].y];
30 }
31 }
32 queue<int>p;
33 int cnt=0;
34 for(int i=1;i<=n;i++)if(in[i]==0)p.push(i),top[i]=++cnt;
35 while(!p.empty())
36 {
37 int now=p.front();p.pop();
38 for(int i=0;i<e[now].size();i++)
39 {
40 int nex=e[now][i];
41 in[nex]--;
42 if(in[nex]==0)
43 {
44 p.push(nex);
45 top[nex]=++cnt;
46 }
47 }
48 }
49 for(int i=1;i<=n;i++)if(in[i])return 0;
50 QAQ.clear();
51 for(int i=1;i<=m;i++)if(ed[i].z<=QWQ&&top[ed[i].y]<top[ed[i].x])QAQ.push_back(i);
52 return 1;
53 }
54 int main()
55 {
56 cin>>n>>m;
57 for(int i=1;i<=m;i++)scanf("%d%d%d",&ed[i].x,&ed[i].y,&ed[i].z);
58 int l=0,r=1e9,ans=0;
59 while(r>=l)
60 {
61 int mid=(l+r)/2;
62 if(check(mid))r=mid-1,ans=mid;
63 else l=mid+1;
64 }
65 check(ans);
66 printf("%d %d\n",ans,QAQ.size());
67 for(int i=0;i<QAQ.size();i++)cout<<QAQ[i]<<" ";
68 return 0;
69 }

CodeForces - 1100E 二分+拓扑排序的更多相关文章

  1. E - E CodeForces - 1100E(拓扑排序 + 二分)

    E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...

  2. codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序

    题目链接 我们可以发现, 这是一个很明显的二分+拓扑排序.... 如何判断根据当前的点, 是否能构造出来一个唯一的拓扑序列呢. 如果有的点没有出现, 那么一定不满足. 如果在加进队列的时候, 同时加了 ...

  3. CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序

    题目链接:http://codeforces.com/contest/655/problem/D 大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系. 解法是二分答案,利用拓扑排序看是 ...

  4. 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348

    目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...

  5. Codeforces 510C (拓扑排序)

    原题:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test:2 seconds mem ...

  6. CodeForces 721C Journey(拓扑排序+DP)

    <题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...

  7. CodeForces - 919D Substring (拓扑排序+dp)

    题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...

  8. Codeforces 919D Substring (拓扑排序+树形dp)

    题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...

  9. Berland Army CodeForces - 883B (贪心,拓扑排序)

    大意: n个点, 点$i$的等级为$r_i$, 只给出部分点的$r$值, $r_i$的范围为[1,k], 且[1,k]都至少有一个. 给定m条有向边, (x,y)表示$r[x]>r[y]$, 求 ...

随机推荐

  1. mybatis-plubs条件构造器中的方法所对应的sql语法

    [通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...

  2. STL_list容器

    一.List简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每 ...

  3. Kubernetes集群管理工具kubectl命令技巧大全

    一. kubectl概述 Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署. kubectl命令的语法如下 ...

  4. 大数据系列2:Hdfs的读写操作

    在前文大数据系列1:一文初识Hdfs中,我们对Hdfs有了简单的认识. 在本文中,我们将会简单的介绍一下Hdfs文件的读写流程,为后续追踪读写流程的源码做准备. Hdfs 架构 首先来个Hdfs的架构 ...

  5. 找不到:DarchetypeCatalog=local

    设置IDEA Maven->Runner 界面的VM Options参数值为-DarchetypeCatalog=local 刷新项目Maven配置,在项目右边界面,重新引入Maven

  6. copy,集合

    一.基础数据类型补充: 1种方法:删除列表里面的元素时,一定不能循环列表,会出错.可以循环索引,然后循环删除开头或结尾这个位置的元素(原开头结尾的元素被删除之后,会有新的元素顶上来). 2种方法:把要 ...

  7. python基础(int,str,bool,list)

    1数字int. 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以:      bit_length() #bit_length() 当十进制用二进制表示时,最少使用的位数 v = 11 1 ...

  8. LOJ10019生日蛋糕

    Mr.W 要制作一个体积为 N*π 的 M 层生日蛋糕,每层都是一个圆柱体. 设从下往上数第 i 蛋糕是半径为 R_i,高度为 H_i 的圆柱.当 i<M 时,要求 R_i>R_{i+1} ...

  9. Elasticsearch如何保证数据不丢失?

    目录 如何保证数据写入过程中不丢 直接落盘的 translog 为什么不怕降低写入吞吐量? 如何保证已写数据在集群中不丢 in-memory buffer 总结 LSM Tree的详细介绍 参考资料 ...

  10. IntelliJ IDEA 20 岁了!20 年前的第 1 版曝光…

    IntelliJ IDEA 最近发布了 20 周年庆典: https://www.jetbrains.com/lp/intellijidea-20-anniversary/ IntelliJ IDEA ...