통신 네트워크 CCF

질문 번호 : 201709-4
질문 이름 : 통신망
시간 제한 : 1.0s
메모리 제한 : 256.0MB
문제 설명 :
문제 설명
  하여 국가 군 N의 개수 부서는 보안을 강화하기 위해, 국 사이에 확립되는 M 섹터에서, 즉 경로 중 단지 하나의 메시지가 각 경로 패스 섹터에 b를 전용의 통로로 B 전송 정보. 이 경우 정보, 즉 릴레이로서, 전송 될 수 송신 정보 CAN B는 , B가 받는 정보를 전달할 수 C를 다음 A를 받는 정보를 전달할 수 C . 메시지는 결국 여러 운송을 통해 목적지에 도달 할 수 있습니다.   보안 업무에 잘 인해 모든 서로의 존재를 모든 부서 서로를 알아. 정보가 두 부서간에 직접 또는 간접적으로 전송 될 수있는 경우에만, 그들은 서로에게 서로의 존재를 알지 못했다. 하지 자신은 다른 분야의 부서 사이에 얘기하는 부서 알고있다.   도 상기 섹터 (4)의 예를 보여주고,도 단방향 에지 경로를 나타낸다. 섹터 1은 모든 부문 메시지 4 개 섹터, 섹터 1과 다른 모든 부문의 존재를 그렇게 인식 부문 4를받을 수 있습니다, 모든 분야에 메시지를 보낼 수 있습니다. 부문 2와 3 사이에 각 부문 2 부문 3은 서로의 존재를 알고하지 않도록 메시지를 보낼 수있는 방법이 분야에서하지 않습니다.   지금은 많은 부서가 모든 방법을 알고 물어 N을



부서가있다. 또는, 얼마나 많은 부서 부서의 수는 그냥 (자신을 포함)을 알고있다 N .
입력 형식
  입력의 첫 번째 줄 포함 두 정수 N M 은 각각 및 섹터들의 수 단방향 경로. 1에 대한 모든 부서 N의 레이블입니다.
  다음에 M의 행 두 정수 각 행 B는 , 섹터 나타내는 섹터에 B 단방향 경로를 가진다.
출력 형식
  답을 나타내는 정수를 포함하는 출력 한 줄.
샘플 입력
4 4
1 2
1 3
2 4
3 4
샘플 출력
샘플 설명
  섹터 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 }

 

추천

출처www.cnblogs.com/FengZeng666/p/11516209.html