本題中對每個點進行一次dfs
該次dfs對與該點互知的點進行標記**(收到資訊和接收資訊均可知道對方存在)**
最後檢視每個點是否知道每個點的存在
剛開始,也是對每個點dfs,
但每次只是將所能到達的點計數,已經到達過的點就跳過;
另外做乙個長度為n的陣列,對於本次dfs到達的點,讓該點在這個陣列中的數加一,也就是說,該陣列[i]表示能到第i個點的數量
這樣就去往某點和到達某點分開判斷
但是會重複,即既能到達所有點,又能接收到所有點的訊息,這樣的點重複計數了
#include
"pch.h"
#include
#include
#include
#include
using namespace std;
const
int n =
1000+1
;const
int m =
10000+1
;vector<
int> links[n +1]
;// 記錄沒個點作為起點的邊
int visited[n +1]
=;// 用於在dfs中標識是否訪問過
int counter[n +1]
[n +1]
=;// i,j 標識第i個人知道第j個人的存在,彼此是互相知道的,因此矩陣總是對稱的
int from =0;
// 標識本次dfs的源點是哪乙個
int n, m;
void
dfs(
int i)
}int
main()
for(
int i =
1; i <= n; i++
)int cnt =0;
for(
int i =
1; i <= n; i++)}
if(flag)
cnt++;}
cout << cnt << endl;
return0;
}
CCF 201709 4 通訊網路
問題描述 某國的軍隊由n個部門組成,為了提高安全性,部門之間建立了m條通路,每條通路只能單向傳遞資訊,即一條從部門a到部門b的通路只能由a向b傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a能將資訊傳遞到b,b又能將資訊傳遞到c,則a能將資訊傳遞到c。一條資訊可能通過多次中轉最終到達目的地。由於保...
ccf 201709 4 通訊網路 100分
問題描述 某國的軍隊由n個部門組成,為了提高安全性,部門之間建立了m條通路,每條通路只能單向傳遞資訊,即一條從部門a到部門b的通路只能由a向b傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a能將資訊傳遞到b,b又能將資訊傳遞到c,則a能將資訊傳遞到c。一條資訊可能通過多次中轉最終到達目的地。由於保...
CCF 2017 09 04 通訊網路
剛開始想的是dfs進行遍歷,然後統計前後這個節點做能到達的節點個數,但卻發現要是有環的話,就沒法做了,想水水看能得幾分,但卻在處理上有一些問題。蒟蒻。看了題解,原來往dfs裡面傳進去兩個當前節點就可以的,然後用乙個節點負責進行遍歷看子節點,另乙個負責統計它能夠到達的節點。然後進行兩遍for迴圈就能夠...