170904 通訊網絡 ccf

參考html

http://www.javashuo.com/article/p-yrudxsyl-dd.htmlc++

思路安全

dfs尋找與某點相連的全部點+vector容器提升效率ide

(不使用vector時只有60分,運行超時)spa

實現code

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define MAXN 1005
 6 
 7 vector<int> path[MAXN];
 8 int vist[MAXN];
 9 int ans[MAXN][MAXN];
10 
11 int dfs(int a,int b){//從b開始深搜尋找與a相通的點 
12     ans[a][b]=1;
13     ans[b][a]=1;
14     vist[b]=1;
15     for(int j=0;j<path[b].size();j++){
16         if(vist[path[b][j]]==0){
17             dfs(a,path[b][j]);
18         }
19     }
20 }
21 
22 int main()
23 {
24     memset(ans,0,sizeof(ans));
25     memset(vist,0,sizeof(vist));
26     
27     int n,m,num=0;
28     cin>>n>>m;
29     int a,b;
30     for(int i=0;i<m;i++){
31         cin>>a>>b;
32         path[a].push_back(b);
33     }
34     
35     for(int i=1;i<=n;i++){
36         memset(vist,0,sizeof(vist));
37         dfs(i,i);
38     }
39     for(int i=1;i<=n;i++){
40         int j=1;
41         for(;j<=n;j++){
42             if(ans[i][j]==0){
43                 break;
44             }
45         }
46         if(j==n+1){
47             num++;
48         }
49     }
50     cout<<num;
51     
52     return 0;
53 }
View Code

題目htm

問題描述blog

  某國的軍隊由 N個部門組成,爲了提升安全性,部門之間創建了 M條通路,每條通路只能單向傳遞信息,即一條從部門 a到部門 b的通路只能由 ab傳遞信息。信息能夠經過中轉的方式進行傳遞,即若是 a能將信息傳遞到 bb又能將信息傳遞到 c,則 a能將信息傳遞到 c。一條信息可能經過屢次中轉最終到達目的地。
  因爲保密工做作得很好,並非全部部門之間都互相知道彼此的存在。只有當兩個部門之間能夠直接或間接傳遞信息時,他們才彼此知道對方的存在。部門之間不會把本身知道哪些部門告訴其餘部門。

  上圖中給了一個4個部門的例子,圖中的單向邊表示通路。部門1能夠將消息發送給全部部門,部門4能夠接收全部部門的消息,因此部門1和部門4知道全部其餘部門的存在。部門2和部門3之間沒有任何方式能夠發送消息,因此部門2和部門3互相不知道彼此的存在。
  如今請問,有多少個部門知道全部 N個部門的存在。或者說,有多少個部門所知道的部門數量(包括本身)正好是 N
 
輸入格式
  輸入的第一行包含兩個整數 NM,分別表示部門的數量和單向通路的數量。全部部門從1到 N標號。
  接下來 M行,每行兩個整數 ab,表示部門 a到部門 b有一條單向通路。
 
輸出格式
  輸出一行,包含一個整數,表示答案。
 
樣例輸入
4 4
1 2
1 3
2 4
3 4
 
樣例輸出
2
 
樣例說明
  部門1和部門4知道全部其餘部門的存在。
 
評測用例規模與約定
  對於30%的評測用例,1 ≤  N ≤ 10,1 ≤  M ≤ 20;
  對於60%的評測用例,1 ≤  N ≤ 100,1 ≤  M ≤ 1000;
  對於100%的評測用例,1 ≤  N ≤ 1000,1 ≤  M ≤ 10000。
相關文章
相關標籤/搜索