題解 P2002 訊息擴散

2021-10-04 22:16:07 字數 1496 閱讀 9177

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

會了強聯通分量以後呢,我們可以開始寫這道題了。首先這道題不是乙個 dag

dagda

g 我們應該先縮點,把這個圖變成乙個 dag

dagda

g。變成 dag

dagda

g 就好了,我們就可以記錄每個點的入度,答案即為所有入度為 0

00 的點的個數。

#include

using

namespace std;

typedef

long

long ll;

template

<

typename t>

inline

void

read

(t &ff)

template

<

typename t>

inline

void

write

(t x)

const

int maxn=

1e6+

10,maxm=

1e6+10;

int s[maxn]

, stop,dfn[maxn]

,low[maxn]

,scccnt, sccnum[maxn]

,dfscnt,tot,he[maxn]

,ne[maxm<<1]

,ed[maxm<<1]

,n,x,y,de[maxn]

,ans,m;

void

add(

int x,

int y)

inline

void

tarjan

(int now)

elseif(

!sccnum[ed[i]])

}if(dfn[now]

==low[now]

)while

(s[stop]

!=now);}

}int

main()

for(

int i=

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

(!dfn[i]

)tarjan

(i);

for(

int i=

1;i<=n;i++

)for

(int j=he[i]

;j;j=ne[j])if

(sccnum[i]

!=sccnum[ed[j]

])de[sccnum[ed[j]]]

++;for(

int i=

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

(!de[i]

)ans++

; cout

}

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 訊息擴散

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