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%就超時了。後來發現根本不需要計算距離,只需要遍歷做標記就行了。