(tarjan)洛谷 P2002 訊息擴散

2021-10-07 12:15:43 字數 1408 閱讀 4503

思路:tarjan縮點,強連通分量裡的點肯定是可以互相到達的,那縮完**度為0的點數就是答案了

有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號城市中發布訊息。

#include #include#include #include #include #include#includeusing namespace std;

#define ll long long

const int maxn=505000;

stackq;

setans;

vectora[maxn];

int cnt,n,m,head[maxn],dfn[maxn],low[maxn],co[maxn],tot,id,out[maxn],root;

struct edge

e[maxn];

void add(int u,int v)

void init()

else if(!co[v])

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

}if(root==u&&ch>=2) ans.insert(u);

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

co[u]=id;

q.pop();

}}int d[maxn];

int main()

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

}/*for(int i=1;i<=n;i++)

*/for(int i=1;i<=n;i++) a[co[i]].push_back(i);

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

int w=0;

for(int i=1;i<=id;i++) w+=(d[i]==0);

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

}

洛谷P2002訊息擴散

傳送門啦 這個題就是tarjan強連通分量與入度的例題了。思路 利用縮點的思想,先預處理一下所有的強連通分量,然後把每個強連通分量內的所有節點看做乙個節點,然後處理一張新圖,然後檢查每個點的入度,然後取入度為 0 的點 縮點後 的個數,即為資訊出發點。可能有人想問為什麼?大體說明一下 1.充分性證明...

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