CF1100E
i207M给的题
给定一张有向图,每条边有边权。你可以花费边权的代价反转一条边,使得原图中没有环。最小化反转的边权的最大值。
首先二分,然后考虑判定。
转化为有些边可以翻转,有些边不可以翻转,使得图中没有环
我们把不能反向的边拿出来,然后跑拓扑排序判环,如果有环则无解,不然一定有一种方案,加入那些可以改变方向的边而不产生环。
新加的边方向:拓扑序小的连向拓扑序大的
有环一定是大的拓扑序连向小的拓扑序有一条边
而这样是一定没有环的!
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,m;
struct edge{
int x,y,z;
}b[N];
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int dfn[N],df;
int q[N],l,r;
int du[N];
int mem[N],tot;
bool topo(){
memset(dfn,,sizeof dfn);
l=,r=;
df=;
for(reg i=;i<=n;++i){
if(du[i]==){
q[++r]=i;
dfn[i]=++df;
}
}
while(l<=r){
int x=q[l++];
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
du[y]--;
if(!du[y]){
dfn[y]=++df;
q[++r]=y;
}
}
}
for(reg i=;i<=n;++i){
if(!dfn[i]) return false;
}
return true;
}
bool che(int mid){
memset(du,,sizeof du);
memset(hd,,sizeof hd);
cnt=;
for(reg i=;i<=m;++i){
if(b[i].z>mid){
add(b[i].x,b[i].y);
++du[b[i].y];
}
}
return topo();
}
int main(){
rd(n);rd(m);
int x,y,z;
int L=,R=;
for(reg i=;i<=m;++i){
rd(x);rd(y);rd(z);R=max(R,z);
b[i].x=x;b[i].y=y;b[i].z=z;
}
int ans=;
while(L<=R){
int mid=(L+R)>>;
if(che(mid)){
ans=mid;R=mid-;
}else L=mid+;
}
printf("%d ",ans);
bool haha=che(ans);
for(reg i=;i<=m;++i){
if(dfn[b[i].x]>dfn[b[i].y]){
mem[++tot]=i;
}
}
sort(mem+,mem+tot+);
printf("%d\n",tot);
for(reg i=;i<=tot;++i){
printf("%d ",mem[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/1/16 11:46:04
*/
CF1100E的更多相关文章
- CF1100E Andrew and Taxi
题目地址:CF1100E Andrew and Taxi 二分,每次取到一个 \(mid\) ,只保留长度 \(>mid\) 的边 dfs判环,若有环,说明 \(ans>mid\) ,否则 ...
- CF1100E Andrew and Taxi 二分答案+拓扑排序
\(\color{#0066ff}{ 题目描述 }\) 给定一个有向图,改变其中某些边的方向,它将成为一个有向无环图. 现在求一个改变边方向的方案,使得所选边边权的最大值最小. \(\color{#0 ...
- CF-1100 E Andrew and Taxi
CF-1100E Andrew and Taxi https://codeforces.com/contest/1100/problem/E 知识点: 二分 判断图中是否有环 题意: 一个有向图,每边 ...
随机推荐
- Django——多网页网站及网页互联
在helloapp文件夹下添加名为templates的文件夹(此文件夹名称是固定的),并在其下添加html文件,文件内容根据自己网页想呈现的内容而定 在views文件内添加新的函数 在urls文件内添 ...
- Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) E. The Supersonic Rocket
这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能 ...
- EasyUI validatebox 自定义ajax验证用户名是否已存在
<td><input type="text" id="userName" name="userName" class=&q ...
- Python数据挖掘——基础知识
Python数据挖掘——基础知识 数据挖掘又称从数据中 挖掘知识.知识提取.数据/模式分析 即为:从数据中发现知识的过程 1.数据清理 (消除噪声,删除不一致数据) 2.数据集成 (多种数据源 组合在 ...
- mysql基础知识大全
前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...
- 原生js和jquey获取窗口宽高,滚动条,鼠标位置总结
JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度 alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height( ...
- HUST学期助教总结
春节还没过完,在回广州的高铁上收到是否愿意担任一次软测助教的询问.想了一天,答应了.而内心其实是有点恐慌的,有几点原因: 大学从来没有学过软件测试这门课程.对于自己的软件测试只是体系并不是很有自信. ...
- 1019psp
1.本周psp: 2.本周进度条: 3.累计进度图(折线图): 4.psp饼状图:
- YQCB冲刺周第三天
团队讨论照片 今天的任务为实现由用户记录一条数据,向数据库中添加一条数据. 遇到的问题为获取单选框.下拉菜单的参数.
- 第六章 过滤器Filter
Filter概述 Filter不用于客户端请求,只用于对request,response进行修改或对context,session,request事件进行监听. 1.概述 如上图,多个filter组成 ...