upc 4189&&河南省第十届大学生程序设计竞赛 情报传递

来源:互联网 发布:淘宝上架宝贝数量 编辑:程序博客网 时间:2024/06/05 20:49

模拟一下 就可 ,如果用邻接表模拟 只能是单向,双向 太麻烦,还有就是利用vector来存储,因为每个人都只有一个上级,因此定义结构体,每个结构体里存储所有儿子与一个父节点,还有一个flag标记 边。建通道时 不断取父节点,删除时用bfs删;

#include<iostream>#include <string.h>#include <vector>#include <queue>using namespace std;struct vect{    vector<int>ve; int father; int flag; };vect vec[5080];int main(){int n,va,t,sum,a;char ch[10];cin>>n;memset(vec,0,sizeof(vec));for (int i=1;i<=n-1;i++){cin>>a;vec[a].ve.push_back(i);vec[i].father=a;}vec[0].father=-1;//因为 0的时候答案是一,因此0上面也有个通道,假设0的父亲为-1;cin>>t;while(t--){scanf("%s%d",ch,&va);sum=0;if (ch[0]=='S'){while(1){if (va==-1||vec[va].flag==1)break;vec[va].flag=1;va=vec[va].father;sum++;}cout<<sum<<endl;}else if (ch[0]=='D'){sum=1;int dat=vec[va].flag;queue<int>q;while (!q.empty()) q.pop();q.push(va);while (!q.empty()){int s=q.front();q.pop();if (vec[s].flag){if (s!=va)sum++;vec[s].flag=0;}int si=vec[s].ve.size();for (int i=0;i<si;i++){int xx=vec[s].ve[i];if (vec[xx].flag==1)q.push(xx);}}    if (sum==1&&dat==0)//注意如果va不在通道上 输出0, 而不会输出他自己                            cout<<"0"<<endl;                             else    cout<<sum<<endl;  }}return 0;} 

阅读全文
0 0
原创粉丝点击