2024.10.12 鲜花

双极定向

INTERNET YAMERO

インターネット・エンジェルという現象は

当代互联网小天使这种现象

仮定された有機交流電燈の

是被假定为有机交流电灯的

かわいい虹色の照明です ぶいっ

一盏可爱虹色照明 耶

あらゆる透明なアカウントの複合体

(所有透明账号的复合体)

このクソゴミカスキショキショな現実を

忘记傻逼垃圾智障的现实吧

忘れさせてあげる 慈愛の天使

帮助你的我乃是 慈爱天使

大人のみんなにはナイショだぞ

这件事可不能告诉大人们哦

大丈夫もうなにも怖くないから

没事的什么都不用怕了

こんなSNS抜けだして二人で海を見に行くぞ!

这破烂SNS待不下去 我们逃走去看海吧!

インターネットや・め・ろ~!!!

因特网呀 快·远·离~!!!

わかる真似をして なにも知らないね アナタ

自以为「我可以懂你」 实际上一无所知的 网友呀

なにが悲しいの なにが寂しいの 聴こえてる?

究竟在悲伤什么 究竟在寂寞什么 你听见了吗?

人が恋しくて 人がイヤすぎて ループ

既贪恋人们的温暖 又厌恶人们的麻烦 循环

夜が好きなのに 一人じゃ寒くて 震えてる

明明就很喜欢夜晚 独自一人却觉苦寒 抖颤

ほんとうは幸せを知っているのに

其实我很清楚幸福的样子是什么

不幸なフリやめられないね

却无法停止 假装世界欠我的

アンチに負けず 信者に媚びず

不输黑子 不媚信徒

どんなに努力を重ねても

小小天使不论怎样努力

一寸先は地獄行き

一步之差便往地狱直行

いやもうすでに冥府魔道

其实早已踏上冥府魔道

地獄の沙汰もいいね次第

有道是高赞能使鬼推磨

偽善者トラップ蜘蛛の糸

伪善者的陷阱蜘蛛之丝

こんなに苦しい筈なのに

明明是如此痛苦室息

インターネットがやめられないない!

却根本无法从因特网远离远离!

発狂!

发狂!

かけめぐるエクスタシー 融けるマイスリー

游走全身的 Ecstasy 渐渐消融的 Myslee

画面光りだすの 不安止まらないよ

屏幕开始闪烁 心中止不住担忧

誰か殺してくれ イヤだ死にたくない

谁快来杀了我吧 不要啊我不想死

朝は見たくないの

不想见到早晨来临

ムリだ!死ぬ!頭が割れてく!!!!!1

不行了!要 命!脑袋要裂开啦!!!!!1

いやー! 死んいたい! 死ぬ! いやー やめろ!

(呀一—!!!好想死哦!!!!要死啦!!!不要!!!住手呀!!!)

それでもわたしはこのカオスをオタクと歩む

即便如此我仍会与宅宅一同在混沌中前行

ここにしかない光景を見つけに行くから

我们要去寻找只有在这里能见到的光景

あんなにおそろしい乱れたインターネットから

从那可怖的狂乱的因特网中降下的

この雪みたいに美しい毒電波がきたんだよ

这些 毒电波竟然如雪一般美丽

カウンセリングを受けたの

我去做心理咨询了哦

先生から「ネットをやめろ」って言われて

医生让我「不要再上网了」

もうおまえらと会えないと思った瞬間 胸が苦しくて

一想到再也见不到你们的瞬间 心里好难过

リアルが壊れてもココが良いって思ったの

哪怕现实会分崩离析 我也更喜欢这里啊

初めてフォローされた日のこと覚えてる

我还记得第一次被人关注的那天

こんなわたしを見て・承認してくれたヌクモリティ

看见我 认可我 人间温暖我的心

もう細かいことはどうでもいいね せーのっ

也用不着在意什么细节了 来一起喊

インターネット最高!!!

当 代 互 联 网 天·下·第·一!!!

ほとばしるエクスタシー 甘い夢をみせてマイスリー

汹涌迸发的 Ecstasy 让我做个好梦吧 Myslee

指先で感じる 泳ぐ電子の海 インターネット・ボーイ

用指尖去细细感触 电子之海中畅游的 Internet Boy

悲しみ舞い散る 暗い闇の中インターネット・ゲーム

悲伤忧郁四散飞舞 黑暗之中的 Internet Game

アナタのとなり微笑む 忘れないでいてねインターネット・ガール

在你身旁微笑展露 要一直记住我哦 Internet Girl

きっと……

一定会……

キボンヌ!オワタ!半年ROMれ!

(球球了!)(完蛋了!)(潜水半年再来罢!)

キタ――(゚∀゚)――! age!漏れ!香具師(やし)!

(キタ――(゚∀゚)――!)(ddd!)(本弟弟!)(铁汁们!)

逝ってよし!久々にワロタ!

(去世罢!)(笑死!)

ぽまいら!

(你们啊!)

これは 乙じゃなくて ポニーテールなんだからね!

(才不是为了犒劳你,只是扎个马尾而已!)

ブヒヒ!ぬるぽ!禿同!

(咕嘿嘿!)(锟斤铐!)(怒赞!)

キボンヌ! 無理ぽ!

(球球了!) (感觉8行!)

オワタ! オマエモナー!

(完蛋了!) (宁不也是!)

半年ROMれ! お礼は3行!

(潜水半年再来罢!) (字数不够彩虹屁!)

キタ――(゚∀゚)――! うp汁!

(kita――(゚∀゚)――!) (链接呢!)

age!漏れ! 日本語でおk!

(ddd!)(本弟弟!) (说人话!)

香具師!逝ってよし! >>1の母です!

(铁汁们!)(去世罢!) (我是楼主的爸爸!)

久々にワロタ!

(笑死!)

キボンヌ!オワタ!半年ROMれ!

(球球了!)(完蛋了!)(潜水半年再来罢!)

キタ――(゚∀゚)――! age!漏れ!

(kita――(゚∀゚)――!)(ddd!)(本弟弟!)

香具師!逝ってよし!

(铁汁们!)(去世罢!)

禿同!

(怒赞!)

好き 好き 好き 好き 好き 好き 好き 好き

好き 好き 好き 好き 好き 好き 好き 好き

喜欢 喜欢 喜欢 喜欢 喜欢 喜欢 喜欢 喜欢

喜欢 喜欢 喜欢 喜欢 喜欢 喜欢 喜欢 喜欢

青白いモニター越しの光を通し

以隔着冷色屏幕投下的光芒

オタクの孤独を癒やして回る

四处治愈宅宅们的孤独

わたしはインターネットの天使なのだ

我就是 互联网上的 天使啊

我竟然真的有一天可以贺到歌词

吉吉定向

问题:给定一张无向连通图 G 和点 S,T,要求对每条边定向,使得 G 成为一张 DAG,且有且仅有 S 入度为零,有且仅有 T 出度为零。

耳:若对于 \(G=(V,E)\) 的子图 \(G'=(V',E')\) 存在 \(x_1,x_2,\cdots,x_k\),满足 \(x_1, x_k\in V', x_2, \cdots, x_{k - 1}\notin V'\)\(\forall i > 1, (x_{i - 1}, x_i)\in E\),则称顶点序列 \(x\)\(G'\) 的耳 . 特别的,当 \(x_1\not=x_k\) 时,称这个耳为开耳。

耳分解:若图 \(G\) 的一个子图序列 \(G_0,G_1,\cdots,G_k\) 满足 \(G_0\) 仅存在一个点或两个点及两点之间的一条边,\(G_k = G, \forall i > 0, G_{i - 1}\subsetneqq G_{i}\)\(G_{i}\setminus G_{i - 1}\)\(G_{i−1}\) 的一个耳,则称该子图序列为 \(G\) 的一个耳分解 . 特别的,若所有 \(G_{i}\setminus G_{i - 1}\) 都是 \(G_{i−1}\) 的开耳,则称该耳分解为开耳分解 .

有结论:

  • \(G\) 是边双 \(\iff G\) 存在耳分解。
  • \(G\) 是点双 \(\iff G\) 存在开耳分解。

考虑一个图有双极定向,当且仅当加入边 \((S,T)\) 后是点双,即存在开耳分解。

必要性是显然的,考虑加入边 \((S,T)\) 后是点双等价于是一个点或缩点后是一条链且 \(S,T\) 分别是其端点,显然缩点后除了 \(S\rightsquigarrow T\) 以外的点一定没法走到。

我们假装存在 \((S,T)\) 这条边,其实是没关系的,他的作用只是确定初始耳的定向,然后依次加耳即可。

建议看代码理解实现,实现的细节挺多的。

K8 的写法是写 tarjan 判无解,但其实直接判断所有边是否都定向了即可。

考虑每个边被恰好定向一次,复杂度 \(O(n+m)\)

板子

Code
#include<bits/stdc++.h>
using namespace std;
using llt=long long;
using llf=long double;
using ull=unsigned long long;
#define endl '\n'
#ifdef LOCAL
	FILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout);
#else
	FILE *InFile=stdin,*OutFile=stdout;
#endif

const int N=4e5+3,M=1e6+3;
int n,m;

struct Gph{
	int hd[N],to[M<<1],nt[M<<1],tot=1;
	void Add(int u,int v){to[++tot]=v,nt[tot]=hd[u],hd[u]=tot;}
	void ADD(int u,int v){Add(u,v),Add(v,u);}
	void Clr(){for(int i=1;i<=n;++i) hd[i]=0; tot=1;}
#define For_to(i,u,v,g) for(int i=g.hd[u],v=g.to[i];i;i=g.nt[i],v=g.to[i])
}g;

class JJD{ // 是 JJ 定向,不是 JJ 大王
private:
	bool vis[M]; int stk[N],dep[N],fa[N],fe[N];
	vector<pair<int,int>> off[N]; queue<pair<int,int>> dfq;
	void Dfs(int u,int d){
		stk[dep[u]=d]=u; // 当前链
		For_to(i,u,v,g){ // 预处理
			int id=i>>1;
			if(id==fe[u]) continue;
			if(!dep[v]) cu[id]=u,cv[id]=v,fa[v]=u,fe[v]=id,Dfs(v,d+1);
			else if(dep[u]>dep[v]) cu[id]=v,cv[id]=u,off[stk[dep[v]+1]].emplace_back(u,id);
		}
	}
	void Def(int u,int d){ // 定向
		if(vis[fe[u]]||u==s) return ;
		vis[fe[u]]=1; if(d) swap(cu[fe[u]],cv[fe[u]]);
		for(auto k:off[u]){
			int v=k.first,id=k.second;
			dfq.emplace(v,d^1);
			vis[id]=1; if(d) swap(cu[id],cv[id]);
		}
		Def(fa[u],d);
	}
public:
	int s,t,cu[M],cv[M];
	void In(){Dfs(s,1);}
	bool operator()(){
		dfq.emplace(t,0); while(!dfq.empty()){auto k=dfq.front(); dfq.pop(); Def(k.first,k.second);}
		for(int i=1;i<=m;++i) if(!vis[i]) return 0; return 1;
	}
	void Out(){for(int i=1;i<=m;++i) cout<<cu[i]<<' '<<cv[i]<<endl;}
	void Clr(){for(int i=1;i<=n;++i) dep[i]=fa[i]=fe[i]=0,vector<pair<int,int>>().swap(off[i]); for(int i=1;i<=m;++i) vis[i]=0;}
}Jjd;

void Clr(){g.Clr(),Jjd.Clr();}

void Slv(){
	cin>>n>>m>>Jjd.s>>Jjd.t; for(int i=1;i<=m;++i) cin>>Jjd.cu[i]>>Jjd.cv[i],g.ADD(Jjd.cu[i],Jjd.cv[i]);
	Jjd.In();
	if(!Jjd()) cout<<"No"<<endl;
	else cout<<"Yes"<<endl,Jjd.Out();
}

int main(){
	ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
	int t; cin>>t; while(t--) Slv(),Clr();
}
P

posted @ 2024-10-12 19:50  xrlong  阅读(26)  评论(0编辑  收藏  举报