질문 번호 : | 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 }