質問番号: | 201709から4 |
質問名: | 通信網 |
制限時間: | 1.0秒 |
メモリの制限: | 256.0メガバイト |
問題の説明: |
問題の説明
カントリー軍
Nの
、セキュリティを向上させるために、部署間で確立される数部門
M
セクタから、即ち、1つのメッセージのみで各パスのパス、パスの
A
セクタに
bの
唯一の通路による に Bが送信されます。情報。場合については、すなわち、リレーを介して送信することができる 情報の缶は、に送信 B、 Bは、に情報を渡すことができる Cその後、 に情報を渡すことができる C。メッセージは、最終的に、複数の通過を介して宛先に到達することができます。 セキュリティの仕事によくやっによるものではなく、すべてが互いの存在を全部門お互いを知っています。情報が2つの部門間で直接または間接的に送信することができた場合にのみ、彼らはお互いにお互いの存在を知っていました。自身が他のセクター内の部門間で伝えるためにどの部門か分かりません。 上記の図は、セクタ4の例を示し、図一方向エッジがパスを表します。セクター1は、すべてのセクタは、他のすべてのセクタの存在のように認識してメッセージ4つのセクタ、セクタ1及びセクタ4を受け取ることができ、すべてのセクターにメッセージを送信することができます。各セクター2とセクター3が互いの存在を知られないように、セクタ2と3の間のいずれかの方法でセクターは、メッセージを送信することができるしません。 今、私は多くの部門がすべてを知っているか、尋ねる Nを
部門があります。または、部門の数は(私を含め)が知られているどのように多くの部署だけである N 。
入力形式
入力の最初の行は二つの整数含ま
N
、
M
それぞれ、セクタ一方向パスの数。1からのすべての部門
Nの
ラベル。
次の M個の 行、各行二つの整数 、 Bは、セクタを表し 、Aセクタに Bが一方向経路を有します。
出力フォーマット
答えを表す整数を含む出力1行。
サンプル入力
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。 |
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<queue> 5 6 #define INF 1000000000 7 8 using namespace std; 9 10 vector<int> v[1100]; 11 int isConnected[1100][1100]; 12 int vis[1100]; 13 14 void dfs(int src, int cur) 15 { 16 vis[src] = 1; 17 isConnected[src][cur] = isConnected[cur][src] = 1; 18 19 for(int i = 0; i < v[src].size(); ++i) 20 { 21 if(!vis[v[src][i]]) 22 { 23 dfs(v[src][i], cur); 24 } 25 26 } 27 } 28 29 int main() 30 { 31 int n, m; 32 scanf("%d%d", &n, &m); 33 for(int i = 1; i <= m; ++i) 34 { 35 int a, b; 36 scanf("%d%d", &a, &b); 37 v[a].push_back(b); 38 } 39 40 for(int i = 1; i <= n; ++i) 41 { 42 memset(vis, 0, sizeof(vis)); 43 dfs(i, i); 44 } 45 46 int ans = 0; 47 for(int i = 1; i <= n; ++i) 48 { 49 int j; 50 for(j = 1; j <= n; ++j) 51 { 52 if(!isConnected[i][j]) 53 break; 54 } 55 if(j == n+1) 56 ++ans; 57 58 } 59 60 printf("%d", ans); 61 62 63 return 0; 64 }