1. 程式人生 > >【USACO 2009 JAN】地震造成的破壞Earthquake Damage(DFS)

【USACO 2009 JAN】地震造成的破壞Earthquake Damage(DFS)

std 路徑和 搜索 一個 幸運 for mage push 編號

題目描述

農夫John的農場遭受了一場地震。有一些牛棚遭到了損壞,但幸運地,所有牛棚間的路徑都還能使用。 FJ的農場有P(1 <= P <= 30,000)個牛棚,編號1..P,C(1 <= C <= 100,000)條雙向路徑連接這些牛棚,編號為1..C,路徑i連接牛棚a_i和b_i (1 <= a_i<= P;1 <= b_i <= P),路徑可能連接a_i到它自己,兩個牛棚之間可能有多條路徑。農莊在編號為1的牛棚。N (1 <= N <= P)頭在不同牛棚的牛通過手機短信report_j(2 <= report_j <= P)告訴FJ它們的牛棚(report_j)沒有損壞,但是它們無法通過路徑和沒有損壞的牛棚回到到農場。當FJ接到所有短信之後,找出最小的不可能回到農莊的牛棚數目。這個數目包括損壞的牛棚。

輸入

第1行: 三個空格分開的數: P, C, 和 N。

第2..C+1行: 每行兩個空格分開的數: a_i 和 b_i * 第C+2..C+N+1行: 每行一個數: report_j。

輸出

第1行: 一個數,最少不能回到農莊的牛的數目(包括損壞的牛棚)。

一個點如果無法到達,也就是說與它相連的所有點都無法到達,那麽我們只需要將所有發短信的奶牛的農場標記一下即可。搜索時記錄訪問到的點,無法到達的點就是不可能回到農莊的牛棚和被破壞的牛棚。

 1 #include <cstdio>
 2 #include <vector>
 3   
 4 #define
N 30001 5 6 int p,c,n,a,b,r,ans; 7 bool vis[N]; 8 std::vector<int> g[N]; 9 10 void dfs(int u){ 11 ++ans; 12 vis[u]=true; 13 for(int i=0;i<g[u].size();++i){ 14 int v=g[u][i]; 15 if(vis[v])continue; 16 dfs(v); 17 } 18 } 19 20 int
main(void){ 21 scanf("%d%d%d",&p,&c,&n); 22 for(int i=1;i<=c;++i){ 23 scanf("%d%d",&a,&b); 24 g[a].push_back(b); 25 g[b].push_back(a); 26 } 27 for(int i=1;i<=n;++i){ 28 scanf("%d",&r); 29 for(int i=0;i<g[r].size();++i){ 30 int v=g[r][i]; 31 vis[v]=true; 32 } 33 } 34 dfs(1); 35 printf("%d",p-ans); 36 }

【USACO 2009 JAN】地震造成的破壞Earthquake Damage(DFS)