P2002 訊息擴散

2021-09-10 22:41:48 字數 1266 閱讀 4879

本場比賽第一題,給個簡單的吧,這 100 分先拿著。

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

輸入格式:

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

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

輸出格式:

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

輸入樣例#1:複製

5 4

1 22 1

2 35 1

輸出樣例#1:複製

2
【資料範圍】

對於20%的資料,n≤200;

對於40%的資料,n≤2,000;

對於100%的資料,n≤100,000,m≤500,000.

【限制】

時間限制:1s,記憶體限制:256m

【注釋】

樣例中在4,5號城市中發布訊息。、

題意:很明顯的乙個tarjan+縮點,直接套模板,然後輸出縮點**度為0的點的個數,注意在輸入的過程中避免成環,應該先來乙個判定,其餘**如下

#includeusing namespace std;

const int maxn = 500010;

int n, m, cnt = 1, a, b, index, sum, total, ans;

int dfn[maxn], low[maxn], belong[maxn], indu[maxn], vis[maxn], stack[maxn], head[maxn];

struct nodenode[2 * maxn];

void add(int u, int v)

void tarjan(int u) else if (vis[v])

} if (low[u] == dfn[u]) while (stack[index + 1] != u); }}

int main()

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

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

} }for (int i = 1; i <= sum; i++)

cout << ans << endl;

return 0;

}

P2002 訊息擴散

本場比賽第一題,給個簡單的吧,這 100 分先拿著。有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。輸入格式 第一行兩個整數n,m表示n個城市,m條單向道路。以下m行,每行兩個整數b,e表示有一條從b到e...

P2002 訊息擴散

本場比賽第一題,給個簡單的吧,這 100 分先拿著。有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。輸入格式 第一行兩個整數n,m表示n個城市,m條單向道路。以下m行,每行兩個整數b,e表示有一條從b到e...

題解 P2002 訊息擴散

有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。會了強聯通分量以後呢,我們可以開始寫這道題了。首先這道題不是乙個 dag dagda g 我們應該先縮點,把這個圖變成乙個 dag dagda g。變成 d...