蒟蒻複習之 Tarjan

2021-08-09 17:28:19 字數 1720 閱讀 9366

#蒟蒻複習之-----tarjan#

//強連通圖的判斷方法

//作為複習篇不講原理

[noip2015]資訊傳遞

//就是找乙個最小環

//標準的模板題(雖然有很多解法)

#include#include#include#includeusing namespace std;

const int maxn = 200000 + 100;

int n;

struct edge e[maxn];

int head[maxn], tot = 0;

int read()

while(ch >= '0' && ch <= '9')

return x * f;

}void add(int u, int v) ;

head[u] = tot;

}stackq;

int dfn[maxn],low[maxn],vis[maxn],cnt = 0,ans = 1<<29;

void dfs(int x)

else if(vis[v])

} if(low[x] == dfn[x]) while(t != x);

if(sum != 1) ans = min(ans,sum); }}

void tarjan()

}int main()

tarjan();

cout<#應用#

##1.找環##

//同上面例題

##2.割邊割點##

//好吧,這個應該不考,不想寫了

//qaq

##3.縮點##

!!!這個很重要,縮了點就可以跑dag了

(dp,蒟蒻瑟瑟發抖~~)–好吧我不會dp

縮點還是會的

[haoi2006]受歡迎的牛

最水的縮點t

#include#include#includeusing namespace std;

const int maxn = 100000 + 100;

int n,m;

struct edge e[maxn * 2];

int head[maxn],tot = 0;

void add(int u, int v) ;

head[u] = tot;

}stackq;

int pre[maxn],low[maxn],vis[maxn],cnt = 0,ctt = 0,tp[maxn],dis[maxn];

void tarjan(int x)

else if(dis[v])

}if(low[x] == pre[x])while(t != x);

}}int d[maxn];

int main()

for(int i = 1; i <= n; i++)

}//注意此處不是for(int i = 1; i <= n; ++) —— for(int j = head[i]; j ; j = e[j].next)

//否則tle

for(int i = 1; i <= m; i++)

}int tt,sum = 0;

for(int i =1; i <= ctt; i++)

}if(sum != 1)

else

}

蒟蒻複習之 Floyd

暴力無解演算法 入門必備 然而我發現這個簡單的演算法還有很多用法 作為複習篇不講原理 圖的要求 既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 複雜度為o n 3 原理 dp思路 f i j f i k f k j void floyd 注意 1應對所建的圖進行初始化如下 void i...

蒟蒻複習之 SPFA,dijkstra

蒟蒻複習之 spfa,dijkstra 好把這個太簡單了 作為複習篇不講原理 dijkstra 表示很少用,即使他要比spfa穩定 附贈 模版題 include include include includeusing namespace std const int maxn 500000 100 ...

蒟蒻複習之 LCA

蒟蒻複習之 lca 這兩年考lca考的特別多,qaq 重要不重要自己體會 1.tarjan 都說tarjan的好寫,一直沒看過 今天看了看挺簡單的,比倍增的好寫多了 個人比較喜歡打多個函式,有點長 模版題 include include includeusing namespace std cons...