P2002 訊息擴散

2021-09-08 13:15:42 字數 1917 閱讀 6261

本場比賽第一題,給個簡單的吧,這 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的點

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int maxn=500001;10

static

void read(int &n)

1114

while(c>='

0'&&c<='9')

15 flag==1?n=-x:n=x;16}

17struct

node

18edge[maxn];

21int

head[maxn];

22int num=1;23

void add_edge(int x,int

y)24

30int

dfn[maxn];

31int

low[maxn];

32int tot=0;33

bool

vis[maxn];

34int

color[maxn];

35int

colornum;

36 stacks;

37void tarjan(int

now)

3849

else

if(vis[edge[i].v])//

公共祖先

5053}54

if(dfn[now]==low[now])//

root

55while(now!=h);66}

67}68int

main()

6979

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

81if(!dfn[i])

82tarjan(i);

83 memset(vis,0,sizeof

(vis));

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

85for(int j=head[i];j!=-1;j=edge[j].nxt)

86if(color[i]!=color[edge[j].v])

87 vis[color[edge[j].v]]=1;//

統計入度為0的點

88int ans=0;89

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

90if(!vis[i])

91 ans++;

92 printf("%d"

,ans);

93return0;

94 }

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