upc 4189&&河南省第十届大学生程序设计竞赛 情报传递
2017-08-31 20:14
281 查看
模拟一下 就可 ,如果用邻接表模拟 只能是单向,双向 太麻烦,还有就是利用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; }
相关文章推荐
- 河南省第十届大学生程序设计竞赛 - 情报传递
- 河南省第十届ACM大学生程序设计竞赛总结
- 河南省第十届大学生程序设计竞赛 情报传递
- 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解
- 河南省第十届大学生程序设计竞赛 年终奖金
- 2017河南省第十届ACM大学生程序设计竞赛总结
- 河南省第十届ACM大学生程序设计竞赛总结
- 河南省第十届ACM大学生程序设计竞赛总结
- 2014年第七届河南省ACM大学生程序设计竞赛有感
- 2017年第十届河南省ACM省赛 B题情报传递
- 杭州电子科技大学计算机学院大学生程序设计竞赛(2015'12)
- 2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛——Mine Number
- 河南省第六届ACM大学生程序设计竞赛 排行榜
- 河南省第十届ACM省赛题目:问题 B: 情报传递
- 2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛——Fruit Ninja II
- 河南省第八届ACM大学生程序设计竞赛的遗憾
- 河南省第九届大学生程序设计竞赛(未完待续)
- 河南省第六届大学生程序设计竞赛 F Card Trick
- upc4041:简单的图论?&&湖南省第十一届大学生计算机程序设计竞赛
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)