P2712 摄像头
题目描述
食品店里有n个摄像头,这种摄像头很笨拙,只能拍摄到固定位置。现有一群胆大妄为的松鼠想要抢劫食品店,为了不让摄像头拍下他们犯罪的证据,他们抢劫前的第一件事就是砸毁这些摄像头。
为了便于砸毁摄像头,松鼠歹徒们把所有摄像头和摄像头能监视到的地方统一编号,一个摄像头能被砸毁的条件是该摄像头所在位置不被其他摄像头监视。
现在你的任务是帮松鼠们计算是否可以砸掉所有摄像头,如不能则输出还没砸掉的摄像头的数量。
输入输出格式
输入格式:第1行,一个整数n,表示摄像头的个数。
第2到n+1行是摄像头的信息,包括:摄像头的位置x,以及这个摄像头可以监视到的位置数m,之后m个数y是此摄像头可以监视到的位置。(砸了这些摄像头之后自然这些位置就监视不到了)
输出格式:若可以砸掉所有摄像头则输出“YES”,否则输出还没砸掉的摄像头的数量。
输入输出样例
输入样例#1:
5 1 1 2 2 1 1 3 1 7 4 1 1 5 0
输出样例#1:
2
神坑题啊,,,,
一没数据数据范围,二题目描述不清楚
“第2到n+1行是摄像头的信息,包括:摄像头的位置x”
这句话的意思就是和你说
一开始遍历的时候只需要遍历到n
查找答案的时候需要查找摄像头的位置
还有就是map其实可以省去。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<map> 7 using namespace std; 8 map<int,int>mp; 9 const int MAXN=1000001; 10 struct node 11 { 12 int u; 13 int v; 14 int next; 15 }edge[MAXN]; 16 int head[MAXN]; 17 int num=1; 18 int rudu[MAXN]; 19 int n; 20 void add(int where,int will) 21 { 22 edge[num].u=where; 23 edge[num].v=will; 24 edge[num].next=head[where]; 25 head[where]=num++; 26 } 27 void topsort() 28 { 29 queue<int>q; 30 for(int i=1;i<=n;i++) 31 if(rudu[i]==0) 32 q.push(i); 33 while(q.size()!=0) 34 { 35 int p=q.front(); 36 q.pop(); 37 for(int i=head[p];i!=-1;i=edge[i].next) 38 { 39 if(edge[i].u==0&&edge[i].v==0)break; 40 int to=edge[i].v; 41 rudu[to]--; 42 if(rudu[to]==0) 43 q.push(to); 44 } 45 } 46 int ans=0; 47 for(int i=1;i<=n;i++) 48 if(rudu[mp[i]]!=0) 49 ans++; 50 if(ans==0) 51 printf("YES"); 52 else 53 printf("%d",ans); 54 } 55 int main() 56 { 57 scanf("%d",&n); 58 for(int i=1;i<=n;i++)head[i]=-1; 59 for(int i=1;i<=n;i++) 60 { 61 int where,m,will; 62 scanf("%d%d",&where,&m); 63 mp[i]=where; 64 for(int j=1;j<=m;j++) 65 { 66 scanf("%d",&will); 67 rudu[will]++; 68 add(mp[i],will); 69 } 70 } 71 topsort(); 72 return 0; 73 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。