头晕的牛

  无意中水过了这道题 就必须得对这道题负起责任。

不能随随便便A题 更不能随随便便水题 。经过思考的题目才会觉得有价值。

有向图和无向图 的混杂 我觉得很不好写 。也跟不知道怎么去写。

仔细分析我们可以得到一个结论 没有自环且有向边不存在环 把无向边 变成有向边并使图中不存在环。

这个 貌似不太好写 因为关于答案的输出必须按照输入的顺序来,那么这个问题一定是有解的了。

证明:把给定的无向边加入图中不存在环,我们可以考虑一条一条无向边按照初始的顺序变成有向边加入图中,当图中存在环,也就是不合法时不过是新图中出现了环,且刚加上的这条边使图出现了环(和我接下来学的基环树契合)那么此时我们改变环的方向环一定会消失,什么时候一定会无解呢那就是加了一条边无论哪个方向一定会都会产生一个环 此时注意 不可能有这种情况的发生,因为此时我们把它看成一条无向边的话两个环就相交了 舍弃掉这条边发现两环相交还是一个大环,那么这个大环一定会被我们之前解决掉所以说是不可能存在无解的情况的,证毕。(题目很严谨,没说无解的情况那一定有解)

此时 就出现了一个n^2的做法 我们对无向边一个一个加每加一次tarjan求强联通分量或者拓扑找环检查是否有环的存在,如果有就更换这条边的方向,然后直接输出这条边大的方向即可。可惜了 n是100000.

我不是王者,也不会n^2过百万。。。

此时讨论中有人 写了一个这样的写法所有边都加进去 然后tarjan不断找环在环上找无向边进行修改 然后最后输出即可。这个显然复杂度比较低,但是真要是卡的话我想也差不多近乎是n^2的 况且很难写 。。。想想细节就比较恶心。

我已经尽力了 和别人讨论一波发现作用不大认为关键还是在判环这个环节 能否O(1)判环,最终显然不可能。

点开题解 然后恍然 题目很好 是我太菜! 我们只在乎 不存在环即可,

那么此时我们按照拓扑排序的方式,仔细思考在什么时候回产生环 一个点连到之前的点此时成环,那么这样子只要我们直接将每个点把能跑的边全部都跑了。

那么最后一定不可能形成环,此时我们加一个d数组 表示优先级,貌似不太行,对于一些无向边他们是无出度的,我可以成对变换,但是输出时是无法判断无向边的优先级的有d数组但是发现d数组的局限性非常的大,貌似根本没什么用。
而此时对于一些无向边且入度为0 我们入度只对单向边产生影响,那么这些边的顺序就随意的了,因为不管怎么样都是只要每个点把自己发出的边全部便利完就肯定没有换的出现,而那么有入度的点就一定得按照顺序来了,不能乱整 按照拓扑序来 就可以了,我们只需拓扑序在后面的点不会再便利到前面的点即可。

然后这道题O(n)即可解决。

//#include<bits/stdc++.h>
#include<iostream>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<deque>
#include<vector>
#include<cctype>
#include<utility>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<bitset>
#define INF 2147483646
#define ll long long
#define U unsigned
#define R register
#define x(i) t[i].x
#define y(i) t[i].y
using namespace std;

char buf[1<<15],*fs,*ft;
inline char getc()
{
    return (    fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin)),fs==ft)?0:*fs++;
}

inline int read()
{
    int x=0,f=1;char ch=getc();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getc();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getc();}
    return x*f;
}

inline void put(int x)
{
    x<0?x=-x,putchar(‘-‘):0;
    int num=0;char ch[90];
    while(x)ch[++num]=x%10+‘0‘,x/=10;
    num==0?putchar(‘0‘):0;
    while(num)putchar(ch[num--]);
    putchar(‘ ‘);return;
}

const int MAXN=100002;
int n,m,k;
int lin[MAXN<<2],nex[MAXN<<2],ver[MAXN<<2],e[MAXN<<2],te[MAXN<<2],len;
int vis[MAXN],ru[MAXN],q[MAXN<<1],T,h;

void add(int x,int y,int z)
{
    ver[++len]=y;
    te[len]=x;
    nex[len]=lin[x];
    lin[x]=len;
    e[len]=z;
}

void bfs()
{
    while(h++<T)
    {
        int te=q[h];vis[te]=1;
        for(int i=lin[te];i;i=nex[i])
        {
            int tn=ver[i];
            if(e[i]==1)e[i^1]=2;
            else if(e[i]==0){--ru[tn];if(ru[tn]==0)q[++T]=tn;}
        }
    }
}

int main()
{
    //freopen("1.in","r",stdin);
    n=read();m=read();k=read();
    for(int i=1;i<=m;++i)
    {
        int x,y;
        x=read();y=read();
        add(x,y,0);ru[y]++;
    }
    if((len&1)==0)++len;
    for(int i=1;i<=k;++i)
    {
        int x,y;
        x=read();y=read();
        add(x,y,1);add(y,x,1);
    }
    for(int i=1;i<=n;++i)if(ru[i]==0)q[++T]=i;
    bfs();
    //for(int i=1;i<=n;++i)put(dis[i]);
    for(int i=1;i<=len;++i)if(e[i]==1)printf("%d %d\n",te[i],ver[i]);
    return 0;
}

哎。太菜了。

至于bzoj这道题 其实我们只要特判样例即可水过只有一个测试点有数据 好坑。。。

原文地址:https://www.cnblogs.com/chdy/p/10590296.html

时间: 2024-10-10 09:44:44

头晕的牛的相关文章

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

饥饿的牛 线性dp内的区间

饥饿的牛 牛在饲料槽前排好了队.饲料槽依次用1到N(1<=N<=100000)编号.每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料. 约翰提供B个区间的清单.一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等.牛可以任意选择区间,但是牛选择的区间不能有重叠.当然,牛希望自己能够吃得越多越好.给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西.在上面的例子中,1-3和3-4是重叠的:聪明

ASIC,DSP,MCU,ARM,FPGA 等网上牛人的一些理解

MPU是微机中的中央处理器(CPU)称为微处理器(MPU) MCU又称单片微型计算机(Single Chip Microcomputer)或者单片机,是指随着大规模集成电路的出现及其发展,将计算机的CPU.RAM.ROM.定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制. DSP是一种独特的CPU,是以数字信号来处理大量信息的器件.其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器(MPU),它的强大数据处理能力和高运行速度,是最值得

bzoj1051【HAOI2006】受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3491  Solved: 1837 [Submit][Status][Discuss] Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. I

牛盾云加速架构分享之SACC演讲

站在互联网+风口上,重点探讨高可用架构设计.存储技术架构.CDN和网络架构优化.前端技术进展.移动应用架构设计.IT架构新思维.运维2.0等技术的2015中国系统架构师大会迎来了一次里程碑的盛况.如何同时满足高安全.高可靠和高依赖的行业架构?如何应对海量实时的大流量.高并发.高响应.高实时的互联网架构需求?牛盾云加速为此做出的贡献与探索无疑对得起大家的掌声.今天小编就给各位带来此次大会上大神kindle充分准备的干货与大家分享,希望给有幸参加会议的诸位加深回忆,也给未能与会的朋友们一些参考,让大

[转载]那些C++牛人的博客

现整理收集C++世界里那些“牛人”的个人博客.凡三类:一是令人高山仰止的大牛,对C++语言本身产生过深远的影响的人:二是C++运用炉火纯青的高手,有原创性的技术干货:三是中文世界里的C++牛人. C++大牛的博客 Bjarne Stroustrup的博客: Bjarne Stroustrup’s Homepage Bjarne Stroustrup,不认识的可以去面壁了,没有他,就没有我们现在的饭碗.Bjarne Stroustrup是丹麦人,目前任教于TAMU.他的Homepage和他的书籍T

牛人与新手的区别

1.牛人就是越来越觉得自己不牛的人:生手就是觉得自己越来越牛的人. 2.牛人就是越来越感觉不会的东西越来越多的人:生手就是觉得不会的东西越来越少的人. 3.牛人就是代码写得越来越简单的人:生手就是代码写得越来越复杂的人. 4.牛人就是动手之前总是不知道如何动手的人:生手就是动手之前根本不用考虑如何动手的人. 5.牛人就是有时候根本都不知道自己在用范式的人:生手就是要么不知道范式,要么千方百计使用范式的人. 6.牛人是全生命周期都在重构的人:生手就是到不得已的时候才想起重构的人. 7.牛人的代码就

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 18[Submit][Status][Discuss] Description 洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q

二十岁出头,你一无所有,但你却拥有一切,因为你还有牛逼的梦想。 可那又怎样,只有行动,才能解除你所有的不安

我从来没有看到过一句话,如此让我共鸣.二十岁出头,你一无所有,但你却拥有一切,因为你还有牛逼的梦想. 可那又怎样,只有行动,才能解除你所有的不安 (一)嘴上说说的人生 那年我在离家的时候一个劲地往自己的硬盘里塞<灌篮高手>,我妈一副嗤之以鼻的表情 看着我,似乎是在说:"这么大的人了居然还这么喜欢看动漫." 我不知道怎么回应她,只好耸耸肩,因为我实在无法对我亲爱的娘亲说明这部动漫对我的 意义. 你知道,有些歌有些东西就是有那种力量.哪怕它在你的手机里藏了好几年,哪怕它早就 过