本場比賽第一題,給個簡單的吧,這 100 分先拿著。
有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。
輸入格式:
第一行兩個整數n,m表示n個城市,m條單向道路。
以下m行,每行兩個整數b,e表示有一條從b到e的道路,道路可以重複或存在自環。
輸出格式:
一行乙個整數,表示至少要在幾個城市中發布訊息。
輸入樣例#1:
5 41 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 #include8using
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...