【河南第十屆省賽-B】情報傳遞
題目描述
抗日戰爭時期,在國共合作的大背景下,中共不斷發展壯大,其情報工作也開始由獲取警報性、保衛性信息,向獲取軍政戰略性情報轉變。各系統情報組織遵循"蔭蔽精幹,長期埋伏,積蓄力量,以待時機"的隱蔽戰線工作方針,開展了卓有成效的情報工作。
***特科組是中共情報工作的一個傑出範例,它以點為主、系統延伸、分散輻射的力量格局,異地領導、分頭派遣、單線聯系的組織形式。以打入、拉出、統戰聯絡、內線為主的工作方式,形成了一個傳遞信息隱蔽、效用及時、形式多樣的情報網絡。
***特科組的情報人員共有N人,其代號分別為0,1,……,N-1。 0號是最高領導人,特工之間有一套嚴格的單線聯絡程序,即,每個特工人員只有一個上線,他獲得的情報需層層上傳遞到0號手裏,由0號發報出去。
特工i在傳遞情報時,若通往到0號的通道尚未建立,則需要建立一級級單線通道;若他的上線已建立好通道,只需建立兩人通道,信息發送給上線;依次類推。若特工i已建立好到0號的通道,則直接發出情報。日偽統治中心南京,既是情報來源豐富的地方,又是特工人員活動最危險的地方。因此,一旦某個特工處於不安全狀態,他必須馬上撤離,同時他的所有下線(處在通道上的一級級下線)也一同撤離。
已知***特科組的組織結構,你的任務是計算,當某特工i需要發送情報時,最少需要建立幾個情報人員的通道;當某特工i處於不安全狀態時,最少需要撤離多少人員。
輸入
第一行一個整數: N ( 1≤N ≤5060 )
接下來一行有N-1 個整數, A1 A2 ……An-1 ,其中Ai是編號i的上線。
下一行一個整數: M 表示有M個狀態,( 1≤M ≤5060 )
接下來有M行 :有兩種形式: Send i 特工i處於要發送情報狀態;
Danger i 特工i處於不安全狀態
輸出
輸出占M行 ,對於Send i,輸出最少需要建立通道的情報人員數,若特工i處於通道線上,輸出0;對於Danger i,輸出最少需要撤離多少人員,若特工i不處於通道線上,則輸出0.
樣例輸入
10
0 1 2 1 3 0 0 3 2
10
Send 0
Send 3
Danger 2
Send 7
Send 5
Send 9
Danger 9
Send 4
Send 1
Send 9
樣例輸出
1 3 2 1 3 1 1 1 0 1
這題很坑啊,如果撤離i,i與其他人沒有通道的話自己是不需要撤離的,有通道連自己帶下層一塊撤離(黑人問號臉.jdp)
#include <bits/stdc++.h> using namespace std; const int N = 5100; vector<int>V[N]; int par[N], num, n; bool mpp[N][N], f; void dfs(int s) { for(unsigned int i = 0; i < V[s].size(); i++) { int v = V[s][i]; if(mpp[s][v]) { f = 1; mpp[s][v] = 0; mpp[v][s] = 0; num++; dfs(v); } } } int main() { int m, a; cin>>n; for(int i = 0; i < n; i++) par[i] = 5066; par[5066] = 5066; for(int i = 1; i < n; i++) { scanf("%d", &a); par[i] = a; V[a].push_back(i); } cin>>m; char s[15]; while(m--) { scanf("%s%d", s, &a); if(s[0] == ‘S‘) { int pa = par[a], ans = 0; while(!mpp[a][pa] && a != 5066) { ans++; mpp[pa][a] = 1; mpp[a][pa] = 1; a = pa; pa = par[a]; } printf("%d\n", ans); } else { num = 0, f = 0; if(mpp[a][par[a]]) f = 1; mpp[a][par[a]] = 0; mpp[par[a]][a] = 0; dfs(a); printf("%d\n", f==1?num+1:0); } } return 0; }
【河南第十屆省賽-B】情報傳遞