题意:
一个n个节点的有向图,节点标号从1到n,存在m条单向边。每条单向边有一个权值,代表翻转其方向所需的代价。求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权。
输入:
单组输入,第一行包含两个整数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开始。没有自环。
输出:
在第一行中输出两个整数,即要翻转的最大的边权,和需要反转道路数量k。k不需要是最小的。
在下一行输出k个由空格分隔的整数,表示需要翻转的道路编号
如果有许多解决方案,请打印其中任何一个
样例:
Input
5 6
2 1 1
5 2 6
2 3 2
3 4 3
4 5 5
1 5 4
Output
2 2
1 3
Input
5 7
2 1 5
3 2 3
1 3 3
2 4 1
4 3 5
5 4 1
1 5 3
Output
3 3
3 4 7
思路:
由于图是有向图,并且题目符合二分特性,我们可以用拓扑排序+加二分解决,我们通过二分,枚举边权,将大于mid的边的入度++,然后进行一波拓扑排序,如果拓扑成功,则说明当前的mid可以,所以我们就缩小mid,如果失败则说明当前的mid不行,我们需要扩大mid,因为小于mid的我们可以进行任意的修改,所以,我们就通过这种方式进行不断缩进,得到最小边权中的最大,并在过程中不段更新形成环的边即可
注意:l
需要从0开始,因为可能图符合拓扑排序没有最大边权
参考代码: