1. 程式人生 > >201709-4 通訊網路

201709-4 通訊網路

試題編號: 201709-4 試題名稱: 通訊網路 時間限制: 1.0s 記憶體限制: 256.0MB

問題描述:

問題描述

  某國的軍隊由N個部門組成,為了提高安全性,部門之間建立了M條通路,每條通路只能單向傳遞資訊,即一條從部門a到部門b的通路只能由a向b傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a能將資訊傳遞到b,b又能將資訊傳遞到c,則a能將資訊傳遞到c。一條資訊可能通過多次中轉最終到達目的地。   由於保密工作做得很好,並不是所有部門之間都互相知道彼此的存在。只有當兩個部門之間可以直接或間接傳遞資訊時,他們才彼此知道對方的存在。部門之間不會把自己知道哪些部門告訴其他部門。

  上圖中給了一個4個部門的例子,圖中的單向邊表示通路。部門1可以將訊息傳送給所有部門,部門4可以接收所有部門的訊息,所以部門1和部門4知道所有其他部門的存在。部門2和部門3之間沒有任何方式可以傳送訊息,所以部門2和部門3互相不知道彼此的存在。   現在請問,有多少個部門知道所有N個部門的存在。或者說,有多少個部門所知道的部門數量(包括自己)正好是N。

輸入格式

  輸入的第一行包含兩個整數N, M,分別表示部門的數量和單向通路的數量。所有部門從1到N標號。   接下來M行,每行兩個整數a, b,表示部門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。   

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int MAXV = 1005
; vector<int> Adj[MAXV]; int n, m; bool d[MAXV][MAXV] = {0}; void BFS(int s) { queue<int> q; q.push(s); while(!q.empty()){ int top = q.front(); q.pop(); for(int i = 0; i < Adj[top].size(); i++) { int news = Adj[top][i]; if(d[s][news] == false){ q.push(news); d[s][news] = true; } } } } int main() { cin >> n >> m; int num = 0; while(m--) { int a, b; cin >> a >> b; Adj[a].push_back(b); } for(int i = 1; i <= n; i++) { BFS(i); d[i][i] = true; } for(int i = 1; i <= n; i++) { int know = 0; for(int j = 1; j <= n; j++) { if(d[i][j] && i != j){ know++; } } for(int j = 1; j <= n; j++) { if(d[j][i] && i != j){ know++; } } know++; if(know >= n){ num++; } } cout << num << endl; }

之前想多了用Dij和Floyd當成最短路徑來算。結果60%就超時了。後來發現根本不需要計算距離,只需要遍歷做標記就行了。