【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛

题目

Description

奶牛们发现,在农场里面赛跑是很有趣的一件事。可是她们一旦在农场里面不断地转圈,就会变得头晕目眩。众所周知,眩晕的奶牛是无法产奶的。于是,农夫约翰想要把他农场里面的双向道路全部改为单向道路,使得他的农场里面一个“圈”都没有,以避免他的奶牛们被搞得晕头转向。如果奶牛可以经过若干条道路回到起点,那么这些道路就称为一个“圈”。

农场有N(1 <= N <= 100000)片草地,编号为1到N。这些草地由M1(1 <= M1 <= 100000)条单向道路和M2(1 <= M2 <= 100000)条双向道路连接起来。任何一条道路都不会把一片草地和这篇草地本身连接起来。但是,任意两片草地之间都可能有多条道路连接。不保证任意两片草地之间都有路径相连。

你的任务是给所有的双向道路设定一个方向,使得整个农场(只剩下单向道路)最后一个圈都没有。也就是说,不存在一个单向道路序列的终点和起点重合。数据保证一开始就有的单向道路中,一个圈都没有。而且一开始就有的单向道路不能改变。

单向道路的起点是草地A_i(1 <= A_i <= N),终点是草地B_i(1 <= B_i <= N)。双向道路连接草地X_i(1 <= X_i <= N)和Y_i(1 <= Y_i <= N)。

考虑下面这个样例:

 

草地1和3,2和3,2和4之间的道路是双向的。还有单向道路连接草地1和2,4和3。一种给双向道路定义方向的方法是,让三条双向道路的方向分别是1到3,2到3,3到4:

Input

第1行: 三个由空格隔开的正数: N, M1和M2

第2到1+M1行: 第i+1行表示第i条单向道路,包含两个由空格隔开的整数: A_i和B_i

第2+M1到第1+M1+M2行: 第i+M1+1行表示第i条单向道路,包含两个由空格隔开的整数X_i和Y_i

Output

第1到M2行: 第i行应该包含两个由空格隔开的整数: 根据你给第i条双向道路定义的的方向,可能是X_i, Y_i,也可能是Y_i, X_i。这些双向道路必须按照输入的顺序输出。如果无解,在单独的一行内输出"-1"。

Sample Input

4 2 3

1 2

4 3

1 3

4 2

3 2

Sample Output

1 3

2 4

2 3

题解

题意

给出一张由无向边和有向边构成的图

问如何将无向边改成有向边使得这张图变成一张有向无环图

分析

方向的问题就想到了拓扑

先把入度为0的点拉进队列

然后逐渐拓扑

遇到一个无向边就把方向定位当前这个点出发的方向

然后输出

这种方法其实是有问题的

因为题目要求的是按输入顺序输出

但是这种做法不一定按输入顺序

只能说数据太水

附:SPJ出锅了,空程序90

比赛总结

要对算法敏感一些

例如这题就是一个拓扑,但是考试的时候没有想到

算法敏感度的来源就是要多刷题

Code

#include<bits/stdc++.h>
using namespace std;
struct node
{
int head,next,to;
}a[100005];
struct node1
{
int head,next,to;
}edge[200005];
int n,m1,m2,x,y,tot,tot1,h,t,b[100005],d[100005];
bool bj[100005];
int read()
{
int res=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
return res;
}
void add(int x,int y)
{
a[++tot].to=y;
a[tot].next=a[x].head;
a[x].head=tot;
}
void add1(int x,int y)
{
edge[++tot1].to=y;
edge[tot1].next=edge[x].head;
edge[x].head=tot1;
}
int main()
{
freopen("dizzy.in","r",stdin);
freopen("dizzy.out","w",stdout);
n=read();m1=read();m2=read();
for (int i=1;i<=m1;++i)
{
x=read();y=read();
add(x,y);
++b[y];
}
for (int i=1;i<=n;++i)
if (!b[i]) d[++t]=i;
for (int i=1;i<=m2;++i)
{
x=read();y=read();
add1(x,y);
add1(y,x);
}
while (h<t)
{
++h;
for (int i=a[d[h]].head;i;i=a[i].next)
{
--b[a[i].to];
if (!b[a[i].to]) d[++t]=a[i].to;
}
for (int i=edge[d[h]].head;i;i=edge[i].next)
if (!bj[edge[i].to]) printf("%d %d\n",d[h],edge[i].to);
bj[d[h]]=true;
}
fclose(stdin);
fclose(stdout);
return 0;
}

【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛的更多相关文章

  1. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

  2. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  3. 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍

    [Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...

  4. JZOJ2020年9月19日提高B组反思

    CSP第一轮倒计时:22天 JZOJ2020年9月19日提高B组反思 今天比的不好,只有签到题过了 130,rank 20 T1 签到题 用二分直接切 AC 100 T2 觉得是依赖背包问题 但是我没 ...

  5. 【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏

    [2014广州市选day1]JZOJ2020年9月12日提高B组T3 消除游戏 题目 Description 相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程 ...

  6. 【2014广州市选day1】JZOJ2020年9月12日提高B组T4 字符串距离

    [2014广州市选day1]JZOJ2020年9月12日提高B组T4 字符串距离 题目 Description 给出两个由小写字母组成的字符串 X 和Y ,我们需要算出两个字符串的距离,定义如下: 1 ...

  7. 【2014广州市选day1】JZOJ2020年9月12日提高B组T2 导弹拦截

    [2014广州市选day1]JZOJ2020年9月12日提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统 V1.0.但是这种导弹拦截系统有一个缺 ...

  8. JZOJ2020年9月12日提高B组反思

    CSP第1轮倒计时:29天 JZOJ2020年9月12日提高B组反思 T1 放在T1却是最难的一题 明显需要高精度 但是我小学奥数没学好,不知道怎么把正有理数转化成分数 T2 明显的DP 可惜的是我文 ...

  9. JZOJ2020年10月5日提高B组反思

    2020年10月5日提高B组反思 T1 考试的时候想简单了 觉得把跟没有攻占的点相连的边留下就可以了 没有考虑到最小 WA&RE 10 T2 没有思路 就直接从中间往后枚举分解处 蜜汁错误 W ...

随机推荐

  1. yii中的andFilterWhere使用说明

    当 WHERE 条件来自于用户的输入时,你通常需要忽略用户输入的空值. 例如,在一个可以通过用户名或者邮箱搜索的表单当中,用户名或者邮箱 输入框没有输入任何东西,这种情况下你想要忽略掉对应的搜索条件, ...

  2. xshell连接windows10子系统ubuntu

    修改端口 cd /etc/ssh#备份sudo cp sshd_config sshd_config.baksudo vim sshd_config修改sshd_config Port 2233 #修 ...

  3. AQS源码深入分析之共享模式-你知道为什么AQS中要有PROPAGATE这个状态吗?

    本文基于JDK-8u261源码分析 本篇文章为AQS系列文的第二篇,前文请看:[传送门] 第一篇:AQS源码深入分析之独占模式-ReentrantLock锁特性详解 1 Semaphore概览 共享模 ...

  4. 令人惊叹的百度Echarts,大数据分析的必备工具

    学习目录 1.可视化面板介绍     1.1技术要点     1.2案例适配方案     1.3页面主体布局2.Echarts(重点)     2.1echarts介绍     2.2echarts体 ...

  5. 第4章 Function语意学

    第4章 Function语意学 目录 第4章 Function语意学 4.1 Member的各种调用方式 Nonstatic Member Function(非静态成员函数) virtual Memb ...

  6. dat.GUI 打造可视化工具(一)

    前言 有时候学习api其实我们可以从源码的角度学习,因为有时候很多文档写的太不清楚了,自己都是慢慢去试,去猜,去实现其实也是挺浪费时间的,面对未知的一脸蒙蔽,偶尔烦躁,其实需要的是自己静下心来慢慢研究 ...

  7. linux下的终端利器----tmux

    转:tmux 是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件.类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个终端登录远 ...

  8. vuex和axios的基本操作

    1.在src目录下创建一个api 是用于集中处理axios的相关配置 index.js就是处理axios的文件 具体如何使用axios 还请百度axios 2.URLs.js是存放需要请求的地址的 3 ...

  9. 网页中Office和pdf相关文件导出

    最近被派去维护和开发一些做了一半.年久失修的项目.有一部分内容是关于word文件导出,顺带着把excel.pdf文件的导出也调研下吧,我想未来开发我应该会遇到的,遂做了下笔记分享给需要的人. 由于项目 ...

  10. 从txt中提取子域名

    import re DOMAIN =[] f = open('test.txt','r',encoding='UTF-8') w = open('domain.txt','w') for data i ...