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 的边,这样去检验有无环存 ...
随机推荐
- 《linux内核设计与实现》第一章
第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...
- Linux内核设计与实现 第五章
1. 什么是系统调用 系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备 ...
- C语言版本:单链表的实现
slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...
- ElasticSearch 2 (3) - Breaking Changes
ElasticSearch 2.1.1 (3) - Breaking Changes Search Changes search_type = scan Deprecated GET /my_ind ...
- PAT 甲级 1078 Hashing
https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 The task of this probl ...
- NetScaler 10.1的配置以及结合StoreFront的部署
工作需要,所以英文+中文,绝壁不是装逼...(关于这点勿喷) This post will cover only the basics for getting NetScaler up and run ...
- OneZero第三次站立会议(2016.3.23)
会议时间:2016年3月23日 13:00~13:15 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论并修改. 会议内容:以下为会议插图 1.界面原型方面,夏在统计界面中 ...
- Fitts’ Law / 菲茨定律(费茨法则)
Fitts’ Law / 菲茨定律(费茨法则) 补充一张雅虎ued绘制的关于Fitts’ Law的Q版小漫画,先初步了解下: Fitts’ Law / 菲茨定律(费茨法则) Fitts’ Law ...
- php学习目录
前面的话 前端工程师为什么要学习php?是因为招聘要求吗?这只是一方面 一开始,我对学习php是抵触的,毕竟javascript已经够自己喝一壶的了,再去学习php,可能让自己喝醉.但是,在学习jav ...
- 【设计模式】—— 备忘录模式Memento
前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...