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
*/

最新文章

  1. CSS padding margin border属性详解
  2. R语言-实用数据对象处理函数
  3. Java系列笔记(3) - Java 内存区域和GC机制
  4. 如何查看oracle数据库告警日志
  5. 5、java反射基础
  6. mac terminal终端ls命令参数详解
  7. Python之路【第十七篇】:Django之【进阶篇】
  8. Python调用C/C++动态链接库
  9. jQuery children等筛选用法
  10. Dollar Dayz poj3181
  11. 原生ajax详解
  12. 201521123059 《Java程序设计》第七周学习总结
  13. javascript 复制数组
  14. Tomcat8+Spring-Security 启用安全通道(https)的一步步实现
  15. 深悉正则(pcre)最大回溯/递归限制
  16. Java中a+=b和a=a+b的区别
  17. linux 退出当前命令的编辑
  18. [jquery]为jQuery.ajax添加onprogress事件
  19. 操作 frames 框架下的 dom 内容。
  20. 2d游戏和 3d游戏的区别

热门文章

  1. JavaScript 中函数的定义和调用
  2. Python中的内建函数(Built_in Funtions)
  3. 学习笔记之shell命令
  4. 基础系列(5)—— C#控制语句
  5. iframe高度自适应的6个方法
  6. 强化学习之QLearning
  7. 周总结web未完成的代码
  8. rsa加密算法,前后端实现。
  9. Struts2(七)
  10. Scrum团队成立及《构建之法》第六、七章读后感