幾道題 Tarjan練習

2021-08-01 15:10:40 字數 3991 閱讀 6806

tarjan的教程網上都有

【cogs8】 備用交換機

7 1 2

2 3

2 4

3 4

4 5

4 6

4 7

5 6

6 7輸出檔名:gd.out

2 2

4求割點

#include

#include

#include

#include

#include

using

namespace

std;

struct edge

map[10001];

int n, a, b, root, cnt=0, dep=0, ans=0;

int head[101], low[101], dfn[101];

bool point[101];

void add(int x, int y)

void tarjan(int x)

else low[x] = min(low[x], dfn[map[i].v]);

}}int main()

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

if(dfn[i]==0)

printf("%d\n", ans);

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

return

0;}

【cogs 618】 傳話

[問題描述]

興趣小組的同學來自各個學校,為了增加友誼,晚會上又進行了乙個傳話遊戲,如果 a 認識 b ,那麼 a 收到某個訊息,就會把這個訊息傳給 b ,以及所有 a 認識的人。

如果 a 認識 b , b 不一定認識 a 。

所有人從 1 到 n 編號,給出所有「認識」關係,問如果 i 發布一條新訊息,那麼會不會經過若干次傳話後,這個訊息傳回給了 i , 1<=i<=n 。

[輸入檔案]

輸入檔案 message.in 中的第一行是兩個數 n(n<1000) 和 m(m<10000) ,兩數之間有乙個空格,表示人數和認識關係數。

接下來的 m 行,每行兩個數 a 和 b ,表示 a 認識 b 。 1<=a, b<=n 。認識關係可能會重複給出,但一行的兩個數不會相同。

[輸出檔案]

輸出檔案 message.out 中一共有 n 行,每行乙個字元 t 或 f 。第 i 行如果是 t ,表示 i 發出一條新訊息會傳回給 i ;如果是 f ,表示 i 發出一條新訊息不會傳回給 i 。

[輸入樣例]

4 6

1 2

2 3

4 1

3 1

1 3

2 3

[輸出樣例]

t t t f

找強連通分量

#include

#include

#include

#include

#include

using

namespace

std;

struct edge

e[200001];

int u, v, t=0, colnum=0;

int n, m, p=0, cnt=0, dep=0;

int head[100001], dfn[100001], low[100001], sta[100001];

int sum[100001], color[100001];

bool insta[100001];

void add(int x, int y)

void tarjan(int x)

else

if(insta[e[i].v]) low[x] = min(low[x], dfn[e[i].v]);

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

while(sta[p--]!=x);

}}int main()

for(int i=1; i<=n; i++) if(dfn[i]==0) tarjan(i);

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

return

0;}

【cogs 921】 [東方s1] 上白澤慧音

題目描述

在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換乙個能夠聚集最多人數的村莊作為新的教學地點。人間之里由n個村莊(編號為1..n)和m條道路組成,道路分為兩種一種為單向通行的,一種為雙向通行的,分別用1和2來標記。如果存在由村莊a到達村莊b的通路,那麼我們認為可以從村莊a到達村莊b,記為(a,b)。當(a,b)和(b,a)同時滿足時,我們認為a,b是絕對連通的,記為。絕對連通區域是指乙個村莊的集合,在這個集合中任意兩個村莊x,y都滿足。現在你的任務是,找出最大的絕對連通區域,並將這個絕對連通區域的村莊按編號依次輸出。若存在兩個最大的,輸出字典序最小的,比如當存在1,3,4和2,5,6這兩個最大連通區域時,輸出的是1,3,4。

輸入格式

第1行:兩個正整數n,m

第2..m+1行:每行三個正整數a,b,t, t = 1表示存在從村莊a到b的單向道路,t = 2表示村莊a,b之間存在雙向通行的道路。保證每條道路只出現一次。

輸出格式

第1行: 1個整數,表示最大的絕對連通區域包含的村莊個數。

第2行:若干個整數,依次輸出最大的絕對連通區域所包含的村莊編號。

輸入樣例

5 5

1 2 1

1 3 2

2 4 2

5 1 2

3 5 1

輸出樣例

3 1 3 5

資料範圍

對於60%的資料:n <= 200且m <= 10,000

對於100%的資料:n <= 5,000且m <= 50,000

強連通分量

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 5001

#define maxm 50001

int n, m, x, y, t;

int p=0, cnt=0, dep=0, colornum=0;

int dfn[maxn], low[maxn], sum[maxn];

int head[maxn], stack[maxn], color[maxn];

bool instack[maxn];

struct edge

e[maxm];

void add(int u, int v)

void tarjan(int u)

else

if(instack[v]) low[u] = min(low[u], dfn[v]);

}if(low[u]==dfn[u])

while(u!=stack[p--]);

}}int main()

for(int i=1; i<=n; i++) if(dfn[i]==0) tarjan(i);

int maxs = 0, outcol = 0;

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

}printf("%d\n", maxs);

for(int i=1; i<=n; i++) if(color[i]==outcol) printf("%d ", i);

return

0;}

幾道趣味題

1.有乙個隨機數發生器,可以產生1到5的隨機數,利用這個隨機發生器,怎樣產生1到7的隨機數 最直接的想法是拿隨機數乘以7然後除以5,但這樣產生的結果並不是等概率的,7 rand 5中產生不了3和6,因而不可行 正確的做法是5 rand rand 然後捨棄最後4個數,剩餘21個數字。每三個數分為一組,...

幾道演算法題

1 n階乘之和 public class test1 sum kk system.out.println sum 2.獲取二維陣列每列最小的值 public class test2 system.out.println sum public long jiecheng int x return su...

幾道練習題

使用map函式 將字串列表 轉化 lxx.ab 形式 方法一 迭代器形式解題 name lxx lj dsvsf def func item name中的每一項都傳過來 循壞item return item sb name1 map func,name map 函式名,可迭代的 name1是乙個迭代...