1. 程式人生 > >圖知識小結6-DFS應用【CCF201709-4通訊網路】

圖知識小結6-DFS應用【CCF201709-4通訊網路】

#include <bits/stdc++.h>
using namespace std;
const int MAX_EDGE = 10005;
const int MAX_VERTICES = 1005;
int conn[MAX_VERTICES][MAX_VERTICES]; //記錄兩個點之間的連通性質 
struct Edge{
	int v, last;
} edge[MAX_EDGE];
bool vst[MAX_VERTICES];
int latest_edge_of_u[MAX_VERTICES];
int eid, nv, ne;
void init(){
	eid = 0;
	for(int i = 0 ; i < MAX_VERTICES ; i++){
		vst[i] = false;
		latest_edge_of_u[i] = -1;
		for(int j = 0 ; j < MAX_VERTICES ; j++){
			conn[i][j] = 0; //0表示沒有連線 
		} 
	}
	
}
void insert(int u, int v){
	edge[eid].v = v;
	edge[eid].last = latest_edge_of_u[u];
	latest_edge_of_u[u] = eid++;   
}
void clear1(){
	for(int i = 1 ; i <= nv ; i++){
		vst[i] = false;
	}
}
void dfs(int u, int initial){
	vst[u] = true;
	conn[u][initial] = conn[initial][u] = 1;
	for(int id = latest_edge_of_u[u] ; id != - 1 ; id = edge[id].last){
		if(!vst[edge[id].v]){
			dfs(edge[id].v, initial);
		}
	}
}
int main(){
	init();
	cin >> nv >> ne;
	int u1, v1, result = 0;
	for(int i = 0 ; i < ne ; i++){
		cin >> u1 >> v1; 
		insert(u1, v1);
	}	
	for(int i = 1 ; i <= nv ; i++){
		clear1();
		dfs(i,i);
	}
	bool flag = true;
	for(int i = 1 ; i <= nv ; i++){
		flag = true;
		for(int j = 1 ; j <= nv; j++){
			if(!conn[i][j]){
				flag = false;
			}
		}
		if(flag) result++;

	}
	cout << result;
	return 0;
}

此題目精巧之處就在於

int conn[MAX_VERTICES][MAX_VERTICES]; //記錄兩個點之間的連通性質

問題描述

試題編號: 201709-4
試題名稱: 通訊網路
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述:

問題描述

  某國的軍隊由N個部門組成,為了提高安全性,部門之間建立了M條通路,每條通路只能單向傳遞資訊,即一條從部門a到部門b的通路只能由ab傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a

能將資訊傳遞到bb又能將資訊傳遞到c,則a能將資訊傳遞到c。一條資訊可能通過多次中轉最終到達目的地。
  由於保密工作做得很好,並不是所有部門之間都互相知道彼此的存在。只有當兩個部門之間可以直接或間接傳遞資訊時,他們才彼此知道對方的存在。部門之間不會把自己知道哪些部門告訴其他部門。

  上圖中給了一個4個部門的例子,圖中的單向邊表示通路。部門1可以將訊息傳送給所有部門,部門4可以接收所有部門的訊息,所以部門1和部門4知道所有其他部門的存在。部門2和部門3之間沒有任何方式可以傳送訊息,所以部門2和部門3互相不知道彼此的存在。
  現在請問,有多少個部門知道所有N個部門的存在。或者說,有多少個部門所知道的部門數量(包括自己)正好是N

輸入格式

  輸入的第一行包含兩個整數NM,分別表示部門的數量和單向通路的數量。所有部門從1到N標號。
  接下來M行,每行兩個整數ab,表示部門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。