UOJGraph(tarjan縮點 拓撲)

2021-07-24 10:12:00 字數 1287 閱讀 1843

description

給出 nn 個點, mm 條邊的有向圖, 對於每個點 vv, 求 a(v)a(v) 表示從點 vv 出發, 能到達的編號最大的點。

input

第 11 行, 22 個整數 nn, mm。 接下來 mm 行, 每行 22 個整數 uiui, vivi, 表示邊 ⟨ui,vi⟩⟨ui,vi⟩。點用 1,2,...,n1,2,...,n 編號。

output

nn 個整數 a(1),a(2),...,a(n)a(1),a(2),...,a(n)。

sample

[input]

4 31 2

2 44 3

[output]

4 4 3 4

note

對於 60% 的資料, 1 ≤ n, k ≤ 103103;

對於 100% 的資料, 1 ≤ n, m ≤ 105105。

【**】

#include #include #include #include #include #include #include #include #define maxn 100005

using namespace std;

typedef pairpa;

setmp;

stacks;

int n,m,to[maxn],mx[maxn],from[maxn],pre[maxn],low[maxn],tme=0,fst[maxn],nxt[maxn],scc[maxn];

int scccnt=0,cnt=0,d[maxn],ft[maxn],nt[maxn],ct=0,de[maxn],t[maxn];

void add(int x,int y)

void add2(int x,int y)

int get()

void dfs(int x)

else if(!scc[to[i]])

} if(low[x]==pre[x]) }}

void init()

for(int i=1;i<=n;++i)if(!pre[i])dfs(i); //注意

}queueq;

void bfs() }}

void solveit()

} for(int i=1;i<=scccnt;++i)if(de[i]==0)q.push(i),de[i]=-1;

bfs();

for(int i=1;i

【注意】

*連通塊連邊時要判斷是否為同一連通塊

*從1~n未pre[ ]的進入dfs而不是d[ ]為0的

Tarjan縮點 SPFA 縮點

洛谷p3387縮點 tarjan spfa求dag上單源最短路模板題 用tarjan在原圖上求scc 縮點 用縮點之後的scc建乙個有向無環圖 scc權為此scc內所有點點權和 在新建的dag上將scc權視為邊權跑spfa 求scc 1 到scc n 的最長路即為所求答案 include inclu...

Tarjan演算法 縮點

我們這一篇是在已經了解tarjan演算法的基礎之上開始寫的,如果不了解的話,請先看大牛們 關於tarjan演算法的部落格。首先我們對於乙個有向無環的圖 dag 至少新增幾條邊才能使它變為強連通圖?我們很容易根據有向無環圖的性質得到,我們計算入度為零的點數為a,出度為零的點數為b,那麼我們至少需要新增...

Tarjan 縮點 模板

縮點以後,整張圖變為dag 有向無環圖 此時運用拓撲排序 求出度入度就可以完成許多事 題目 include include include include include include define ll long long using namespace std const int maxn 1...