圖知識小結6-DFS應用【CCF201709-4通訊網路】
阿新 • • 發佈:2018-12-11
#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的通路只能由a向b傳遞資訊。資訊可以通過中轉的方式進行傳遞,即如果a 由於保密工作做得很好,並不是所有部門之間都互相知道彼此的存在。只有當兩個部門之間可以直接或間接傳遞資訊時,他們才彼此知道對方的存在。部門之間不會把自己知道哪些部門告訴其他部門。 上圖中給了一個4個部門的例子,圖中的單向邊表示通路。部門1可以將訊息傳送給所有部門,部門4可以接收所有部門的訊息,所以部門1和部門4知道所有其他部門的存在。部門2和部門3之間沒有任何方式可以傳送訊息,所以部門2和部門3互相不知道彼此的存在。 現在請問,有多少個部門知道所有N個部門的存在。或者說,有多少個部門所知道的部門數量(包括自己)正好是N 輸入格式 輸入的第一行包含兩個整數N, M,分別表示部門的數量和單向通路的數量。所有部門從1到N標號。 輸出格式 輸出一行,包含一個整數,表示答案。 樣例輸入 4 4 樣例輸出 2 樣例說明 部門1和部門4知道所有其他部門的存在。 評測用例規模與約定 對於30%的評測用例,1 ≤ N ≤ 10,1 ≤ M ≤ 20; |