[USACO09DEC]晕牛Dizzy Cows (拓扑排序)
https://www.luogu.org/problem/P2017
题目背景
Hzwer 神犇最近又征服了一个国家,然后接下来却也遇见了一个难题。
题目描述
The cows have taken to racing each other around the farm but they get very dizzy when running in circles, and everyone knows that dizzy cows don't produce any milk. Farmer John wants to convert all of the two-way cow paths in the farm to one-way paths in order to eliminate any 'cycles' and prevent the cows from getting dizzy. A 'cycle' enables a cow to traverse one or more cow paths and arrive back at her starting point, thus completing a loop or circle.
The farm comprises N pastures (1 <= N <= 100,000) conveniently numbered 1..N. M1 (1 <= M1 <= 100,000) one-way cow paths and M2 two-way cow paths (1 <= M2 <= 100,000) connect the pastures. No path directly connects a pasture to itself, although multiple paths might connect two different pastures. A cow may or may not be able to travel between any two given pastures by following a sequence of cow paths.
Your job is to assign a direction to the two-way cow paths such that the entire farm (ultimately with only one-way paths) has no cycles. That is, there should be no sequence of one-way cow paths which leads back to its starting position. The existing one-way cow paths do not form a cycle and should be left as they are.
One-way cow paths run from pasture A_i (1 <= A_i <= N) to pasture B_i (1 <= B_i <= N). Two-way cow paths connect pastures X_i (1 <= X_i <= N) and Y_i (1 <= Y_i <= N).
Consider this example:
-->
| /|
| / |
|/ |
<--
The cow paths between pastures 1 and 3, 2 and 3, and 2 and 4 are two-way paths. One-way paths connect 1 to 2 and also 4 to 3. One valid way to convert the two-way paths into one-way paths in such a way that there are no cycles would be to direct them from 1 to 3, from 2 to 3, and from 3 to 4:
-->
| /|
| / |
vL v
<--
奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就 会变得头晕目眩.众所周知,眩晕的奶牛是无法产奶的.于是,农夫约翰想要把他农场里面的双向道路全部改为单向道路,使得他的农场里面一个圈都没有,以避免他的奶牛们被搞得晕头转向.如果奶牛可以经过若干条道路回到起点,那么这些道路就称为一个圈.
农场有N(1 < N < 100000)片草地,编号为1到N.这些草地由M1条单向 道路和M2条双向道路连接起来.任何一条道路都不会把一片草地和这篇草地本 身连接起来.但是,任意两片草地之间都可能有多条道路连接.不保证任意两片草地之间都有路 径相连.
你的任务是给所有的双向道路设定一个方向,使得整个农场(只剩下单向道路)最后一个圈都 没有.也就是说,不存在一个单向道路序列的终点和起点重合.数据保证一开始就有的单向道路中,一个圈都没有.而且一开始就有的单向道路不能改变.
单向道路的起点是草地Ai,终点是草地Bi.双向道路连接草地Xi,Yi
输入格式
从 dizzy.in 中输入数据
第一行 3 个整数 n,p1,p2,分别表示点数,有向边的数量,无向边的数量。
第二行起输入 p1 行,每行 2 个整数,a,b,表示 a 到 b 有一条有向边。
接下来输入 p2 行,每行 2 个整数 a,b,表示 a 和 b 中间有一条无向边。
输出格式
输出到 dizzy.out 中
对于每条无向边,我们要求按输入顺序输出你定向的结果,也就是如果你输出 a‘b,那
表示你将 a 和 b 中间的无向边定向为 a → b。
注意,也许存在很多可行的解。你只要输出其中任意一个就好。
(注:因为没有spj,我们保证按照常规方法做出的答案一定可以AC)
输入输出样例
输入 #1
输出 #1
题意:
给你一张有向无向混合图,要求你为无向边定向,使得图上没有环。
题解:
这是一道关于拓扑排序的题。
如果一个有向图没有环,那么一定可以进行拓扑排序,因为拓扑排序的前提要求是进行排序的图必须是DAG。
我们在看这道题的要求,就会发现,当你把所有双向边改成单向边以后,这个图就一定是一个DAG,否则一定无解。
那么我们只先读进来有向边,进行拓扑排序,就会得到一个序列
我们知道如果一个点在另一个点顺序的后面的话,如果我们添加这个点回去的边显然是不合理的,可能产生环,所以我们每读入一条无向边的时候我们判断这个点在拓扑排序里面位置的大小。
所以简述就是:
先拓扑排序按有向边排序,记录序号,然后无向边的顺序按排序后序号的大小定向
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI=acos(-);
const int maxn=;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); struct Edge
{
int u;
int v;
int next;
}edge[maxn]; int n,e1,e2,u,v;
int head[maxn];
int in[maxn];//入度
int od[maxn];//拓扑排序的次序,用来判断
int cnt_edge;
int cnt;//拓扑排序的计数器
queue<int> qe; void add_edge(int u,int v)
{
edge[++cnt_edge].next=head[u];
edge[cnt_edge].u=u;
edge[cnt_edge].v=v;
head[u]=cnt_edge;
} int main()
{
//freopen("sample.txt","r",stdin);
scanf("%d %d %d",&n,&e1,&e2);
for(int i=;i<e1;i++)
{
scanf("%d %d",&u,&v);
add_edge(u,v);
in[v]++;
}
for(int i=;i<=n;i++)//将入度为0的入队
{
if(in[i]==)
{
qe.push(i);
od[i]=++cnt;
}
}
while(!qe.empty())//拓扑排序
{
u=qe.front();
qe.pop();
for(int i=head[u];i;i=edge[i].next)
{
in[edge[i].v]--;
if(!in[edge[i].v])
{
qe.push(edge[i].v);
od[edge[i].v]=++cnt;
}
}
}
for(int i=;i<=e2;i++)//判断无向边的方向
{
scanf("%d %d",&u,&v);
if(od[u]<od[v])
printf("%d %d\n",u,v);
else
printf("%d %d\n",v,u);
}
return ;
}
[USACO09DEC]晕牛Dizzy Cows (拓扑排序)的更多相关文章
- 洛谷P2017 [USACO09DEC]晕牛Dizzy Cows [拓扑排序]
题目传送门 晕牛Dizzy Cows 题目背景 Hzwer 神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. 题目描述 The cows have taken to racing each o ...
- 题解 p2017 [USACO09DEC]晕牛Dizzy Cows
前言:P大终于又更新了 正文 转送门 由于当时我这个ZZ不知怎么了,这份题解排版可能有些尴尬,建议大家读完题后,看我主程序前的代码的注释,然后看最下面的图片,然后看第一张图片,对不起,望多谅解 以样例 ...
- [USACO09DEC] Dizzy Cows 拓扑序
[USACO09DEC] Dizzy Cows 拓扑序 先对有向边跑拓扑排序,记录下每个点拓扑序,为了使最后的图不存在环,加入的\(p2\)条无向边\(u,v\)必须满足\(u\)拓扑序小于\(v\) ...
- 拓扑排序/DP【洛谷P2883】 [USACO07MAR]牛交通Cow Traffic
P2883 [USACO07MAR]牛交通Cow Traffic 随着牛的数量增加,农场的道路的拥挤现象十分严重,特别是在每天晚上的挤奶时间.为了解决这个问题,FJ决定研究这个问题,以能找到导致拥堵现 ...
- 牛客 51011 可达性统计(拓扑排序,bitset)
牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...
- 牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
题目链接 这个题,一眼看上去就是最短路的题,边权有负环显然不能用dij,然后出题人又卡了spfa,,那怎么办的想点办法啊,好像还有一个拓扑排序可以求最短路吧,这时候正解就已经得到了,就是拓扑排序求最短 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- 牛客网NOIP赛前集训营-提高组(第六场)-A-最长路[拓扑排序+hash+倍增]
题意 给定一个 \(n\) 点 \(m\) 边的边权非负的有向图,边有字符,求以每个点为开头的最长路字典序最小的路径 \(hash\) 值. \(n,m\leq 10^6\) 分析 首先建反图拓扑排序 ...
- [HAOI2006]受欢迎的牛 tarjan缩点 + 拓扑排序
---题面--- 题解: 首先tarjan缩点应该还是容易想到的,因为喜爱具有传递性,所以一个强联通分量里面的点实际上是全部等效的,所以我们可以缩成一个方便判断, 缩完点之后整张图就变成了一个有向无环 ...
随机推荐
- Nginx系列p5:进程管理(信号)
通过上图我们可以看到:信号与命令行的关系,下面我们来简单总结一下上述命令的作用: CHLD: 当子进程终止的时候,会向父进程发送 CHLD 信号,这样,如果子进程由于某些模块出现了 Bug,导致子进程 ...
- python py pyc pyw pyo pyd之间区别
来源: http://blog.csdn.net/chroming/article/details/52083387 1.py 脚本文件,是最基本的源码扩展名.windows下直接双击运行会调用pyt ...
- sed使用案例
简介: sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 ...
- SpringCloud学习之Config分布式配置中心(八)
统一配置中心概述 如果微服务架构中没有使用统一配置中心时,所存在的问题: 配置文件分散在各个项目里,不方便维护 配置内容安全与权限,实际开发中,开发人员是不知道线上环境的配置的 更新配置后,项目需要重 ...
- Q4:Median of Two Sorted Arrays
4. Median of Two Sorted Arrays 官方的链接:4. Median of Two Sorted Arrays Description : There are two sort ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- 技术沙龙|原来落地AI应用是这么回事儿!
目前人工智能已经迈入应用落地之年,作为备受关注的话题,在重磅政策的加持下市场规模迅速扩大并渗透到各行各业的形势越发鲜明.在此背景下,作为国内不容忽视的创新企业之一,京东AI依托于NeuHub平台对数据 ...
- Java--二维码生成&图片和流转化
package test; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java. ...
- elasticsearch-集群管理
1.集群结构 ES 通常以集群方式工作.以提高搜索性能.容错能力.高可用.实现PB级数据搜索. 相关概念: (1)结点: ES集群由多台ES服务器组成.每个ES 服务端就是个一个NODE结点 (2)分 ...
- 修复grub
进入命令行模式,#chroot /mnt/sysimage :切换根目录#grub2-install /dev/sda :安装grub2到第一硬盘#grub2-mkconfig -o /boot/gr ...