传送门:QAQQAQ

题意:给你一个图,每条边有边权,现在你可以对边进行反转,使图中不存在环,你需要使得反转的边的边权集合中的最大值最小,并输出任意一组解。

思路:二分+拓扑排序

使得最大值最小,自然而然想到二分(其实我先想到tarjan,发现环套环无法处理)

那么我们二分枚举答案,把小于mid的边全部拆了,判断剩下边是否成环(dfs,之前染色方法玄学错误),若没有环则当前mid成立

为什么呢?——如果我们把一条删掉的边连上,无论怎么摆都会形成一个环,那么原先的边一定有一条大环,所以原先这种情况就不可能成立(画个图可以模拟一下)

那么现在我们已经证明删掉的边按照一定顺序摆一定不会有环,我们只需要找出一种这样的顺序。

进行拓扑排序,如果一条边是由拓扑序大的连向拓扑序小的,我们就将它反转,这样就可以保证没有坏

证明:删掉比mid小的边后剩下的一定是若干个DAG,产生环的根本原因是儿子有返祖边,而父亲拓扑序一定比儿子小(因为是用queue维护的),所以若所有边都从拓扑序小的连向拓扑序大的,就一定不会产生返祖边

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=210000;struct node{int from,to,cost,id;
}E[N];
vector<int> v;int first[N],nxt[N],point[N],w[N],e=0,dfn[N];
void add_edge(int x,int y,int z,int num)
{e++;E[num].id=e;point[e]=y; w[e]=z;nxt[e]=first[x];first[x]=e;
}bool cmp(node x,node y)
{if(x.cost==y.cost) return x.id<y.id;return x.cost<y.cost;
}int vis[N],bl[N],n,m,judge,best,in[N];
void dfs(int u)
{vis[u]=2;for(int i=first[u];i!=-1;i=nxt[i]){if(bl[i]) continue;int p=point[i];if(vis[p]==2) {judge=0;return;}if(!vis[p]) dfs(p); }vis[u]=1;return;
}bool check(int mid)
{judge=1; memset(vis,0,sizeof(vis));memset(bl,0,sizeof(bl));for(int i=1;i<=mid;i++) bl[E[i].id]=1; for(int i=1;i<=n;i++) {if(!vis[i]) {dfs(i);}}return judge;
}int main()
{memset(first,-1,sizeof(first));memset(nxt,-1,sizeof(nxt));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&E[i].from,&E[i].to,&E[i].cost);add_edge(E[i].from,E[i].to,E[i].cost,i);}sort(E+1,E+m+1,cmp);int l=0,r=m,mid;best=-1;while(l<=r){mid=(l+r)>>1;if(check(mid)) r=mid-1,best=mid;else l=mid+1;}queue<int> q;int tot=0;memset(in,0,sizeof(in));for(int i=best+1;i<=m;i++){in[E[i].to]++;}for(int i=1;i<=n;i++) if(!in[i]) q.push(i);memset(bl,0,sizeof(bl));for(int i=1;i<=best;i++) bl[E[i].id]=1;while(!q.empty()){int now=q.front();q.pop();dfn[now]=++tot;for(int i=first[now];i!=-1;i=nxt[i]){if(bl[i]) continue;int pos=point[i];in[pos]--;if(!in[pos]) q.push(pos); }}for(int i=1;i<=best;i++) {int x=E[i].from;int y=E[i].to;if(dfn[x]>dfn[y]) v.push_back(E[i].id);}printf("%d %d\n",E[best].cost,(int)v.size());for(int i=0;i<(int)v.size();i++) printf("%d ",v[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/Forever-666/p/11235050.html

codeforces 1100E-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 C. Andrew and Stones

    题目大意:一个操作定义如下:每次选三个下标1<=i<j<k<=n,把a[j]的值减2然后各给a[i]和a[k]加1 问能不能把2~n-1的所有元素归0,如果能,输出最小次数 思 ...

  3. 题解 CF1100E 【Andrew and Taxi】

    题意:给定一个有向图,改变其中某些边的方向,它将成为一个有向无环图.现在求一个改变边方向的方案,使得所选边边权的最大值最小. 输出:边权的最小值,被反向的边的个数及编号. Solution:只要二分把 ...

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

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

  5. CodeForces 158B Taxi(代数算式解题)

    本人ACM菜鸟一枚,偶然做到这(水)题,发现师兄和网上给代码大多都是用数组做的,本人是直接算的,都是贪心的思想.但就这题而言,个人认为直接用代数方法来算的代码效率更高,上题: 题目大意说,有n组人,每 ...

  6. Codeforces #158B Taxi

    一. 问题描述 After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to ...

  7. CodeForces 158 B. Taxi(模拟)

    [题目链接]click here~~ [题目大意]n组团体去包车,每组团体的人数<=4,一辆车最多容纳4人,求所求车的数目最小 [解题思路]:思路见代码~~ // C #ifndef _GLIB ...

  8. http://codeforces.com/problemset/problem/158/B Taxi

    s=4的肯定单独坐一辆. s=3需要与s=1的共同乘坐,可以想到s=3单独乘坐一辆并不是最优的,因为还空了一个位子,而这个空出来的位置只能由s=1的填进去,这样放显然是最优的因为s=1的如果不放进去以 ...

  9. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp

    题目链接: http://codeforces.com/contest/464/problem/C J. Substitutes in Number time limit per test 1 sec ...

最新文章

  1. 活见鬼,明明删除了数据,空间却没减少!
  2. SpringCloud_项目搭建以及Eureka
  3. 精确到秒的JQuery日期控件,jquery日历插件,jquery日期插件
  4. python代码画简单图-Python figure参数及subplot子图绘制代码
  5. PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名
  6. 从零写一个编译器(一):输入系统和词法分析
  7. 的文件夹结构_Windows中你需要知道的目录结构 「第一期」
  8. linux swftools java_linux下安装swftools工具
  9. (66)SPI外设驱动发送驱动(五)(第14天)
  10. opencv表面缺陷检测_机器视觉表面缺陷检测 光学元件瑕疵检测
  11. 解决:git push error: failed to push some refs to
  12. 三十、K8s供应链安全1-准入控制器
  13. 【渝粤教育】国家开放大学2018年春季 0179-21T数据库基础与应用 参考试题
  14. 1.1确定分数与浮点数值之间的近似相等性。
  15. idea创建web项目的时候报错:Error reading file E:/workspaces/**/pom.xml
  16. RK100键盘说明书
  17. centos主机测磁盘读写速度极限
  18. Activiti6.0流程引擎学习——(22)activiti的任务管理服务(TaskService)
  19. 【毕业设计源码】基于Python的校园生活助手(二手+活动+论坛+新闻)信息系统
  20. 网络安全技术第六章——第三节木马的攻击与防治(中木马现象、木马病毒概念结构、木马实施攻击过程、配置传播运行连接木马、远程控制、木马伪装手段、更换图标改名换姓文件捆绑出错显示网页嫁衣自我销毁邮件附件)

热门文章

  1. java中延迟任务的处理方式
  2. ubuntu 构建 deb 安装包
  3. 通过Java代码装配bean
  4. 多线程编程:阻塞、并发队列的使用总结
  5. 64位debian系统下安装inodeClient
  6. PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
  7. Web- HTML网页颜色大全
  8. C# WebBrowser 设置代理
  9. rewrite 伪静态,地址重写
  10. 嵌入式linux, CAN 驱动有关问题