玲珑学院1072 【DFS】
蛤蛤,略蠢。
priority_queue 自定义优先级 和排序是反的
struct node { int x,y; friend bool operator< (node a,node b) { if(a.y<b.y) return 1; if(a.y==b.y&&a.x>b.x) return 1; return 0; } }; priority_queue<node>qu;
+v就加一下,标记一下
对了-v 遍历一下,标记一下
加个优先队列维护一下结点的大小,深度。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; struct node { int x,y; friend bool operator< (node a,node b) { if(a.y<b.y) return 1; if(a.y==b.y&&a.x>b.x) return 1; return 0; } }; priority_queue<node>qu; map<int,int>kt; struct asd { int to; int next; }; int n; asd q[N*4]; int head[N*4],tol; bool vis1[100010]; void add(int u,int v) { q[tol].to=v; q[tol].next=head[u]; head[u]=tol++; node now; now.x=v; kt[v]=kt[u]+1; now.y=kt[v]; qu.push(now); } void ceshi() { node now; int uu; scanf("%d",&uu); for(int i=1;i<=uu;i++) { scanf("%d%d",&now.x,&now.y); qu.push(now); } while(!qu.empty()) { now=qu.top(); printf("%d %d \n",now.x,now.y); qu.pop(); } puts(""); } void Delet(int u) { vis1[u]=0; for(int i=head[u]; i!=-1; i=q[i].next) { int v=q[i].to; if(!vis1[v]) continue; Delet(v); } } int main() { int T; int x; scanf("%d",&T); while(T--) { while(!qu.empty()) qu.pop(); //ceshi(); memset(vis1,0,sizeof(vis1)); memset(head,-1,sizeof(head)); tol=0; kt.clear();//深度啊 kt[1]=1; node now; now.x=1; now.y=kt[1]; qu.push(now); vis1[1]=1; int num=2; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&x); if(x<0) { x=-x; Delet(x); } else { add(x,num); vis1[num]=1; num++; } while(!qu.empty()) { node now=qu.top(); if(!vis1[now.x]) qu.pop(); else { printf("%d\n",now.x); break; } } } } return 0; }