题意:给定一个有向图,改变其中某些边的方向,它将成为一个有向无环图。现在求一个改变边方向的方案,使得所选边边权的最大值最小。


输出:边权的最小值,被反向的边的个数及编号。


Solution:只要二分把每一条边和预期的 valvalval 个controllers 作比较,只让大于它的边联通,判断有无环即可(该部分的正确性其他题解已经讲得很清楚了,此不再赘述)。最后用拓扑判断是否使这些边反向即可。但是关于每次判断边是否遍历过,我发现每一篇题解都用 memset 来归零,这样如果范围过大不免导致被卡。所以我们可以采用 tottottot 作为第 tottottot 次二分时的标记,如果 prep≠totpre_{p} \not= totprep​​=tot ,就代表这一次没有经历过。同时,我们可以通过 vistovis_{to}visto​ 的非 0 来判断其有无环。(别忘了清零哦!)这样,我们就省去了每次 memset 的损耗了。


more:如果想要追求极致的话可以尝试离散化取值。(我因为太懒就懒得弄了)

code–>

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cctype>
#include <cstring>
#define PT 520using namespace std;struct node{int to, nxt, v;
}e[1000005];queue <int> que;int n, m, head[1000005], cnt, l, r, vis[1000005], pre[1000005], tot;
int sum, ans[1000005], ppp, minn = 1023456789, dfn[1000005], id[1000005];inline void add(int from, int to, int v){e[++cnt].nxt = head[from];head[from] = cnt;e[cnt].to = to;e[cnt].v = v;
}inline int dfs(int p, int val){pre[p] = tot;vis[p] = 1;for(int i = head[p]; i; i = e[i].nxt ){if(e[i].v > val){if(pre[e[i].to] == tot && !vis[e[i].to ]){continue;}if((pre[e[i].to ] == tot && vis[e[i].to ]) || dfs(e[i].to , val)) return 1;}}vis[p] = 0;return 0;
}inline void work(int val){for(int i = 1; i <= m; i++)if(e[i].v > val) dfn[e[i].to ]++;for(int i = 1; i <= n; i++)if(!dfn[i]) que.push(i);while(!que.empty()){int u = que.front();que.pop();id[u] = ++sum;for(int i = head[u]; i; i = e[i].nxt ){if(e[i].v > val){dfn[e[i].to ]--;if(!dfn[e[i].to ]) que.push(e[i].to );}}}
}int read()
{        int s = 0, f = 1;        char ch = getchar();        while(!isdigit(ch)) {        if(ch == '-') f = -1;        ch = getchar();        }        while(isdigit(ch)) {        s = s * 10 + ch - '0';        ch = getchar();        }        return s * f;
}        int main(){n = read(), m = read();for(int i = 1; i <= m; i++){int x = read(), y = read(), z = read();add(x, y, z);r = max(r, z);}l = 0;int fl;while(l < r){fl = 0;tot++;sum = 0;int mid = (l + r) >> 1;for(int i = 1; i <= n; i++){if(pre[i] != tot && dfs(i, mid)){fl = 1;break; }}if(!fl){r = mid;}else {l = mid + 1;}}printf("%d ",r);sum = 0;work(r);for(int i = 1; i <= n; i++){for(int j = head[i]; j; j = e[j].nxt ){if(e[j].v <= r){if(id[e[j].to ] < id[i]){ans[++ppp] = j;}}}}printf("%d\n",ppp);sort(ans + 1, ans + ppp + 1);for(int i = 1; i <= ppp; i++)printf("%d ",ans[i]);return 0;
}

完结撒 fā ✿✿ヽ(°▽°)ノ✿

题解 CF1100E 【Andrew and Taxi】相关推荐

  1. 【CodeForces 1100E】二分答案 | 拓扑排序 | E

    这是一道很美妙的题- 1100E. Andrew and Taxi time limit per test: 2 seconds memory limit per test: 256 megabyte ...

  2. 【codeforces 718 CD】C. Sasha and ArrayD. Andrew and Chemistry

    C. Sasha and Array 题目大意&题目链接: http://codeforces.com/problemset/problem/718/C 长度为n的正整数数列,有m次操作,$o ...

  3. 凸包 初学 Andrew 和 Melkman (模板) 旋转卡(qia)壳(ke)

    凸包初学 定义: 给你n个散落的点,让你求出最小的凸多边形将所有的点包括起来,或者点在边上. 稳定凸包,不能再扩充,每条边都用3个点 必备知识: 会用叉积判断点与直线的关系(这里指 点在线的那一边, ...

  4. P3076 [USACO13FEB]Taxi G

    [USACO13FEB]Taxi G 题目描述 Bessie is running a taxi service for the other cows on the farm. The cows ha ...

  5. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  6. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  7. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  8. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  9. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

最新文章

  1. 算出当前系统后某个月的日期_Python3.7知其然知其所以然-第十八章 日期函数
  2. python入门教程书-清华大学出版社-图书详情-《Python快速入门精讲》
  3. linux 命令综述
  4. OpenGL 光照贴图Lighting maps
  5. python跨目录调用_python 跨目录访问文件
  6. Hystrix中的批量(折叠)请求
  7. C++语言(11)——C++类成员函数调用分析
  8. jQuery EasyUI教程之datagrid应用-1
  9. 【转】SpringMVC Controller 介绍
  10. android中gridview实现动态表格,Android--GridView实现动态文字排版
  11. sigmoid函数解决溢出_常见激活函数优缺点与dead relu problem
  12. 【优化预测】基于matlab布谷鸟搜索算法优化SVM预测【含Matlab源码 1525期】
  13. java 车牌模糊_【技术贴】如何处理模糊车牌号?绝对PS技术干货,不保证适用所有情况。...
  14. Markdown win10上显示awesomium
  15. matlab 量化与过采样,[转载]降采样,过采样,欠采样,子采样,下采样
  16. 国内主流Arduino图形化编程软件专业评测
  17. 新浪微博登陆页面html代码,新浪微博登陆页面 找到我的位置,选择编辑;
  18. 拾叶集 文/江湖一剑客
  19. Microsoft Teams 创建Outlook邮件组的Team
  20. 一次解决找不到 android.support.v7.XXX 问题

热门文章

  1. java jolt tuxedo_2019年用Java通过Jolt连接Tuxedo.doc
  2. unity插件开发让女朋友财富自由之路
  3. linux设备模型 英文,Linux设备模型--platform
  4. CANVAS模仿龙卷风特效
  5. thinkphp5.1+layui图片上传(前端部分.第二种)
  6. 2017_第八届蓝桥杯省赛题解 JavaB组
  7. 计算机硬件和软件系统ppt,计算机硬件系统和软件系统.ppt
  8. 如何安装FastDFS
  9. 【神经网络】{7} ——理解反向传播
  10. PCB各种封装命名尺寸