CodeForces - 1100E 二分+拓扑排序
题意:
一个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 二分+拓扑排序的更多相关文章
- E - E CodeForces - 1100E(拓扑排序 + 二分)
E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...
- codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序
题目链接 我们可以发现, 这是一个很明显的二分+拓扑排序.... 如何判断根据当前的点, 是否能构造出来一个唯一的拓扑序列呢. 如果有的点没有出现, 那么一定不满足. 如果在加进队列的时候, 同时加了 ...
- CF #CROC 2016 - Elimination Round D. Robot Rapping Results Report 二分+拓扑排序
题目链接:http://codeforces.com/contest/655/problem/D 大意是给若干对偏序,问最少需要前多少对关系,可以确定所有的大小关系. 解法是二分答案,利用拓扑排序看是 ...
- 【二分+拓扑排序】Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348
目录 Milking Order @USACO 2018 US Open Contest, Gold/upc_exam_6348 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 MEA ...
- Codeforces 510C (拓扑排序)
原题:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test:2 seconds mem ...
- CodeForces 721C Journey(拓扑排序+DP)
<题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...
- CodeForces - 919D Substring (拓扑排序+dp)
题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...
- Codeforces 919D Substring (拓扑排序+树形dp)
题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...
- Berland Army CodeForces - 883B (贪心,拓扑排序)
大意: n个点, 点$i$的等级为$r_i$, 只给出部分点的$r$值, $r_i$的范围为[1,k], 且[1,k]都至少有一个. 给定m条有向边, (x,y)表示$r[x]>r[y]$, 求 ...
随机推荐
- 剑指Offer-连续子数组中的最大和
题目 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n). 输入 [1,-2,3,10,-4,7,2,-5] 返回值 ...
- PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS
题目分析: 可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合 ...
- Centos 6 下安装 OSSEC-2.8.1 邮件告警 (二)
Ossec 配置邮件通知 ## 1 安装软件包: yum install -y sendmail mailx cyrus-sasl cyrus-sasl-plain #安装postfix邮件相关的软件 ...
- Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)
一.Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使用稳定版本. 2.上传Nginx到Linux服务器. 3.安装依赖环 ...
- Python找对称数——纪念第一次自主编写代码
2021-01-17 题目: [问题描述]已知10个四位数输出所有对称数及个数 n,例如1221.2332都是对称数[输入形式]10个四位数,以空格分隔开[输出形式]输入的四位数中的所有对称数,对称数 ...
- 5.2 Spring5源码--Spring AOP源码分析二
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- Netty学习:伪共享
目录 Netty中的伪共享 伪共享的原理以及介绍 Netty中的伪共享 先说为什么知道这个概念吧,期初看Netty源码的时候,看到了NioEventLoop的构建,其中有这么一句代码: private ...
- MongoDB数据库,一些的筛选过滤查询操作和db.updae()更新数据库记录遇到的坑。
缘由:使用MongoDB时遇到一些需要查询/更新操作指定某些字段的业务场景 查询和更新指定字段就需要进行简单的筛选和过滤,也能在大数据量时减少查询消耗时间 1. 查询数据库某些指定字段,同时默认返回_ ...
- sap的内核升级,修补了源代码保护的方式
众所周知,在SAP的内核位701或者之前的版本中,我们可以通过向源代码的中加入"*@#@@[SAP]"这样的代码,来实现对源代码的保护.但是在内核升级到721和以后的版本中,你会发 ...
- 性能测试WAS内存使用的探索和分析
性能测试中,CPU和内存是关注最多的两个性能指标.以我行应用最多的系统架构(WAS+Oracle)来说,CPU使用率高的问题多发生于数据库,比如索引不当引发的表扫描.绑定变量使用不当引发的硬解析.连接 ...