強連通分量 分組

2021-10-09 14:53:28 字數 2780 閱讀 2551

希望更好的閱讀體驗?點這裡

資訊學競賽班的班主任smart是一位心思很縝密的老師,他在接手資訊學競賽班乙個學期以後,想調查一下班上同學之間相互交流的情況,以便及時了解班級動態。

資訊學競賽班一共有 n

nn 個同學。這 n

nn 位同學每乙個人都有乙個小花名冊,名冊裡面寫著他所願意交流的人的名字。比如說在 a

aa 的人名單裡寫了 b

bb ,那麼表示 a

aa 願意與 b

bb 交流;但是 b

bb 的名單裡不見得有 a

aa ,也就是說 b

bb 不見得想與 a

aa 交流。但是如果 a

aa 願意與 b

bb 交流,b

bb 願意與 c

cc 交流,那麼 a

aa 一定願意與 c

cc 交流。也就是說交流有傳遞性。

班主任smart覺得需要將這 n

nn 個人分為 m

mm 組,要求每一組的任何一人都願意與組內其他人交流。並求出一種方案以確定 m

mm 的最小值是多少。

第一行乙個整數 n

nn(1≤n

≤200

1 \le n \le 200

1≤n≤20

0)。接下來 n

nn 行,第 (i+

1)

(i+1)

(i+1

) 行表示編號為 i

ii 的人的小花名冊名單,名單以 0

00 結束。

注意:自己的名單裡面不會有自己的名字。

一行,乙個整數 m

mm 。

5

2 01 0

4 5 0

3 04 0

2
樣例中 1

11 和 2

22 分在一組,3

33 、4

44 和 5

55 分在一組。

分成的每組都要求任何人都願意與組內其他人交流,指的就是對於每組中任意兩個頂點 u

uu 和 v

vv ,從 u

uu 到 v

vv 有一條路徑,同時從 v

vv 到 u

uu 又有一條路徑。又因為分組數最小,所以求強連通分量的個數就行了,下面提供兩種方法:

不會tarjan的戳這裡

如果知道題目求的是強連通分量的話,這道題就是tarjan模板題,注意讀入。

#include

#include

#define min(a,b) ((a)<(b)?(a):(b))

struct edgee[

40003];

int n,head[

203]

,len,ans,dfn[

203]

,low[

203]

,index;

std::stack<

int> s;

bool ins[

203]

;//ins表示是否在棧內

void

add(

int&u,

int&v)

void

tarjan

(int x)

if(dfn[x]

==low[x])}

}}intmain()

}for

(int i=

1;i<=n;i++)if

(!dfn[i]

)tarjan

(i);

printf

("%d\n"

,ans)

;return0;

}

如果不會寫tarjan,可以用floyd解決。

設 f [i

][j]

f[i][j]

f[i][j

] 表示 i

ii 是否願意與 j

jj 交流,則 katex parse error: expected 'eof', got '&' at position 16: f[i][j]=f[i][k]&̲&f[k][j] 。

再設 vis

[i

]vis[i]

vis[i]

表示第 i

ii 個人是否被分過組,列舉每乙個 i

ii ,如果 i

ii 沒分過組,列舉 j=i

+1…n

j=i+1 \dotsc n

j=i+1…

n ,如果 f[i

][j]

f[i][j]

f[i][j

] 和 f[j

][i]

f[j][i]

f[j][i

] 同時為真,說明有乙個強連通分量,讓 vis

[j]=

1vis[j]=1

vis[j]

=1,具體**如下:

#include

bool f[

203]

[203

],vis[

203]

;void

floyd

(int

&n)int

main()

}floyd

(n);

for(

int i=

1;i<=n;i++)}

printf

("%d\n"

,ans)

;return0;

}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量

對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...

強連通分量

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...