強連通分量 tarjan

2021-09-13 11:51:31 字數 2698 閱讀 8866

題1:p2002 訊息擴散

題目描述

有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。

輸入輸出格式

輸入格式:

第一行兩個整數n,m表示n個城市,m條單向道路。

以下m行,每行兩個整數b,e表示有一條從b到e的道路,道路可以重複或存在自環。

輸出格式:

一行乙個整數,表示至少要在幾個城市中發布訊息。

輸入樣例

5 41 2

2 12 3

5 1輸出樣例

2

//p2002 訊息擴散

#include

#include

#include

#include

#define maxn 100005

#define maxm 500005

using

namespace std;

int n,m;

int head[maxn]=;

//鏈式向前星儲存

int dfn[maxn]=;

//時間戳陣列,dfs[x]指x是第幾個被搜尋點點

int low[maxn]=;

//和該點強連通點最早被搜尋點

bool in[maxn]=;

//是否在棧中

int edge_num=0;

int sum=0;

int color=0;

//同乙個強連通分量染成同樣顏色

int belong[maxn]=;

//乙個點屬於哪個強連通分量

int in_degree[maxn]=;

//強連通分量的入度

int ans=0;

stack<

int> st;

struct edge

eg[maxm]

;void

add(

int a,

int b)

void

scanff()

}void

tarjan

(int x)

//搜尋過但未確定屬於哪個強連通分量(在棧中)

else

if(in[t]

) low[x]

=min

(low[x]

,low[t]);

}if(low[x]

==dfn[x])}

}void

work()

intmain()

輸入輸出格式

輸入格式:

 第一行:兩個用空格分開的整數:n和m

 第二行到第m + 1行:每行兩個用空格分開的整數:a和b,表示a喜歡b

輸出格式:

 第一行:單獨乙個整數,表示明星奶牛的數量

輸入輸出樣例

輸入樣例

3 31 2

2 12 3

輸出樣例

1分析:

用tarjan將每個強連通分量坍縮成乙個點後形成乙個有向無環圖(若成環那此環又可以成為乙個強連通分量)。

若乙個點是明星,則所有點都通向它,它不通向任何點(否則成環)。因此,其出度為0。乙個連通子圖中只能有這麼乙個「明星點」(否則非連通)。若此圖為非連通圖,就沒有明星,直接輸出0;否則輸出「明星點」的成員數。

//

#include

#include

#include

#include

#define maxn 100005

#define maxm 500005

using

namespace std;

int n,m;

int head[maxn]=;

int edge_num=0;

stack<

int> st;

int dfn[maxn]=;

int low[maxn]=;

bool in[maxn]=;

int belong[maxn]=;

int num[maxn]=;

//記錄每個強連通分量中點點個數

int sum=0;

int color=0;

//和上題基本一樣

int out_degree[maxn]=;

struct edge

eg[maxm]

;void

add(

int a,

int b)

void

scanff()

}void

tarjan

(int x)

else

if(in[t]

) low[x]

=min

(low[x]

,low[t]);

}if(dfn[x]

==low[x])}

}void

work()

}int s=0;

for(

int i=

1;i<=color;i++

) s=i;}}

printf

("%d\n"

,num[s]);

}int

main()

強連通分量 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

洛谷 p2812 校園網路 洛谷 p3387 縮點 include include include include include using namespace std struct arrbot 1100000 d 1100000 int head 20000 h 20000 stack 200...

強連通分量 tarjan

struct enodeedge maxm int p maxn ec void inserte int u,int v,int w int dfn maxn ctime,low maxn 時間戳,時間戳計數,祖先時間。int gid maxn gc 分量陣列,分量計數。bool ins maxn ...