題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 ...