思路: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...