第十届省赛 B题.情报传递

xiaoxiao2021-02-28  67

题目:

这道题是昨天热身赛A的的扩充。 这道题里面有一些东西需要根据样例的输出来获取 比如: 0 也要向上级传递信息           这个树的关系是确定的,但通道并不一定建立           这可以通过样例的前5条推断出来

是一道需要动点脑筋的题,把样例给的图(树)画出来,

分析输出的值,来确定准确的题意。 

代码:

#include<iostream> #include<vector> #include<queue> #include<string.h> #include<cmath> #include<string> #include<set> #include<list> #include<stack> #include<cctype> #include<functional> #include<algorithm> #include<iostream> #include<stdio.h> #include<sstream> usingnamespace std; int n, m; int up[5100]; int build[5100]; vector<int> down[5100]; int Send(int s) { int ret = 0; // 顺着s一直找上级,一直找到0 while (s) { if (!build[s]) { build[s] =true; ret++; } s = up[s]; } // 注意0本身也要向上建立通道。 // 因为样例的第一行 Send 0 输出为 0 if (!build[0]) { build[0] = true; ret++; } return ret; } int Danger(int s) { int ret = 0; queue<int> q; q.push(s); while (!q.empty()) { //从队列中拉取一个节点 s = q.front(); q.pop(); //看 s 自己是否向上级建立了通道 if (build[s]) { ret++; build[s] =false; } //遍历 s 所有的下级 for (int i = 0; i < down[s].size(); ++i) { // 看这个下级是否建立了通道 if (build[down[s][i]]) q.push(down[s][i]); } } return ret; } int main() { int i; cin >> n; for (i = 1; i <n; ++i) { scanf("%d", &up[i]); // 设置 i的上级 down[up[i]].push_back(i); // 设置属于up[i] 的下级 } char buffer[20]; cin >> m; for (i = 0; i <m; ++i) { int num; scanf("%s", buffer); scanf("%d", &num); //只用比较第一个字符就可以知道是哪条命令 if (buffer[0] =='S') printf("%d\n", Send(num)); else printf("%d\n", Danger(num)); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-83748.html

最新回复(0)