E. Andrew and Taxi(二分+拓扑判环)
题目链接:http://codeforces.com/contest/1100/problem/E
题目大意:给你n和m,n代表有n个城市,m代表有m条边,然后m行输入三个数,起点,终点,花费。,每一条边的花费指的是将这条路方向反转的花费。然后问你使得整个图没有环的最小花费。(这里的最小花费指的是改变方向的边中,权值最大的那个)。
具体思路:二分答案,我们找出符合题目条件的最优解,check的时候,建立边权大于当前值的边,我们是通过形成的图判断有没有环来检验的,找到最优解之后,将剩余边权的大于最优解的边建立一个图,然后进行拓扑排序。再枚举每一条边,看这一条边的起点和终点的拓扑序,如果说起点的拓扑序大于终点的拓扑序,也就是说这条边应该是方向翻转,然后找出这满足情况的边就可以了。
反思:
1.这样为什么可以呢?昨晚打比赛的时候想到了一种情况,就是如果将当前的一条边翻转之后,原来的图中的环会不再存在,但是会形成新的图,这样的话也是不行的,但是对于这种情况,画画图就知道了,这种情况的话,外面肯定是有一个大环的,我们只需要对这个大环进行操作就可以了(操作的边数没有限制,只要这条边权比当前二分的值小就可以了)。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
# define ll long long
# define pi acos(-1.0)
const int maxn = 1e5+;
int deg[maxn],head[maxn],ord[maxn],vis[maxn];
int num,n,m;
vector<int>qq;
struct node
{
int fr;
int to;
int nex;
int cost;
} q[maxn],edge[maxn*];
void init()
{
num=;
memset(head,-,sizeof(head));
memset(deg,,sizeof(deg));
}
void addedge(int fr,int to)
{
edge[num].to=to;
edge[num].nex=head[fr];
head[fr]=num++;
deg[to]++;
}
bool check(int t)
{
memset(vis,,sizeof(vis));
init();
for(int i=; i<=m; i++)
{
if(q[i].cost>t)
addedge(q[i].fr,q[i].to);
}
queue<int>wakaka;
for(int i=;i<=n;i++){
if(deg[i]==){
wakaka.push(i);
}
}
while(!wakaka.empty()){
int top=wakaka.front();
wakaka.pop();
vis[top]=;
for(int i=head[top];i!=-;i=edge[i].nex){
int u=edge[i].to;
if(--deg[u]==)wakaka.push(u);
}
}
for(int i=;i<=n;i++){
if(vis[i]==)return false;//(拓扑判环)
}
return true;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=; i<=m; i++)
{
scanf("%d %d %d",&q[i].fr,&q[i].to,&q[i].cost);
}
int l=,r=1e9;
while(l<r)
{
int mid=(l+r)/;
if(check(mid))
{
r=mid;
}
else
l=mid+;
}
init();
for(int i=; i<=m; i++)
{
if(q[i].cost>r)
{
addedge(q[i].fr,q[i].to);
}
}
queue<int>wakaka;
for(int i=; i<=n; i++)
{
if(!deg[i])
wakaka.push(i);
}
memset(ord,,sizeof(ord));
int ans=;
while(!wakaka.empty())
{
int top=wakaka.front();
wakaka.pop();
ord[top]=++ans;
for(int i=head[top]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
deg[to]--;
if(!deg[to])
{
wakaka.push(to);
}
}
}
for(int i=; i<=m; i++)
{
if(ord[q[i].fr]>ord[q[i].to])//(拓扑序)
{
qq.push_back(i);
}
}
printf("%d %d\n",r,qq.size());
int len=qq.size();
for(int i=; i<len; i++)
{
if(i==)
printf("%d",qq[i]);
else
printf(" %d",qq[i]);
}
printf("\n");
return ;
}
E. Andrew and Taxi(二分+拓扑判环)的更多相关文章
- 牛客寒假算法基础集训营4 F(二分+拓扑判环)
题目链接 题目的输出:对于每次提问,输出一行"Yes"表示大家都遵守了群规,反之输出"No". 那么输出的就是一连串的yes和no了,二分一下无环的最大提问位置 ...
- 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型
最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...
- hdu 4324 Triangle LOVE(拓扑判环)
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- CF1100E Andrew and Taxi 二分答案+拓扑排序
\(\color{#0066ff}{ 题目描述 }\) 给定一个有向图,改变其中某些边的方向,它将成为一个有向无环图. 现在求一个改变边方向的方案,使得所选边边权的最大值最小. \(\color{#0 ...
- Coloring Edges 【拓扑判环】
题目链接:https://vjudge.net/contest/330119#problem/A 题目大意: 1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色.问最少需要多少 ...
- 【建图+拓扑判环】BZOJ3953: [WF2013]Self-Assembly
Description 自动化学制造(Automatic Chemical Manufacturing,简称ACM)正在对一个叫自组装(self-assembly)的过程进行实验.在这个过程中,有着天 ...
- CF1100E Andrew and Taxi
题目地址:CF1100E Andrew and Taxi 二分,每次取到一个 \(mid\) ,只保留长度 \(>mid\) 的边 dfs判环,若有环,说明 \(ans>mid\) ,否则 ...
- CF 1100E Andrew and Taxi(二分答案)
E. Andrew and Taxi time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- E - Andrew and Taxi-二分答案-topo判环
E - Andrew and Taxi 思路 :min max 明显二分答案,二分需要破坏的那些边的中机器人数量最多的那个. check 过程建边时直接忽略掉小于 mid 的边,这样去检验有无环存 ...
随机推荐
- SimpleDateFormat的一些常用用法
/** SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D ...
- 互评Final版本——可以低头,但没必要——取件帮
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; (1)N(Need,需求) 当今大部分在校学生由于各种原因懒于亲自去取快递,而总麻烦身边人也不是长久之计.而有些同学需 ...
- Linux内核分析——计算机是如何工作的
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ( ...
- “数学口袋精灵”第二个Sprint计划(第五天)
“数学口袋精灵”第二个Sprint计划----第五天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 进度: 冯美欣:欢迎界面背景 ...
- 关于断言(Assert)
断言,字面上的意思大致是十分肯定的说,也就是说我们相信这个结果是真的.如果我们的断言不为真,那这个这个结果就和我们预期的结果不一样.在编程上同理,如果程序运行出来的结果和你想要的结果不一致,那你的程序 ...
- 深入理解学习Git工作流(git-workflow-tutorial)
转载:https://segmentfault.com/a/1190000002918123#articleHeader11 人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协 ...
- MySQL基础(一):基本操作
一.下载安装及连接 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- element-ui upload组建上传 file-list踩过的坑
昨天修完了一个上传组件删除时,图片删掉了,但是地址仍然在的bug,今天测试告诉我bug没休掉,what !,昨天修完之后我自测了一下,OK的好吗,但是测试给我演示了一下,问题仍然存在!!!我看了一下调 ...
- #LOJ2564 SDOI2018 原题识别 主席树
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/9057297.html 原题链接: 今天考试考了前天的SDOI考题 天啊我菜爆,只有T2拿了30分 然后考试后半 ...
- 洛谷P4299 首都(BZOJ3510)(LCT,树的重心,二分查找)
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会 ...