????????????
?????????O2????????????????????????
????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????N????????????????????????M???????????????????????????????????????
?????????????????????????????????A??????B?????????????????????????????????????????????????????????????????????????????????????????????1??????????????????????????????A??????B??????????????????????????????????????????????????????
???????????????????????????1??????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1?????????2??????????????????????????????????????????????????????????????????Q??????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????
???????????????
????????????????????????N,M,Q???
?????????M????????????2?????????ai,bi,?????????i??????????????????????????????i?????????????????????
?????????Q????????????????????????rj???????????????????????????????????????
???????????????
Q??????????????????????????????????????????????????????
??????????????????
??????
??????????????????
?????? ??????2 ??????3 ??????4 ??????5
?????? 1 1 2 2
1 1 1 2 2
2 1 2 2 3
3 1 2 2 3
4 2 2 3 3
5 2 2 4 3
??????????????????
??????20%????????? N???100, Q???30
??????40%????????? Q???30
??????70%????????? ??????????????????????????????????????????50?????????????????????????????????????????????????????????
??????100%????????? N???100000, Q???M???200000
???????????????????????????(???????????????????????????Log ??? 2333)???????????????x???1?????????????????????????????????????????????dis[u]+1==dis[x]????????????(u,x)???u???u?????????1?????????????????????????????????(u,x)????????????
???????????????????????????????????????dis[]???????????????????????????????????????DAG???????????????????????????????????????????????????????????????????????????
?????????u??????v???????????????1???????????? DAG?????? <u,v> ??????(????????????????????????)??????( u???1?????????????????? ?????? ?????????(u,v)???????????????)?????????????????????????????????????????? ?????????????????? ?????????????????????????????????????????????map????????????????????????
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<vector> #include<map> #include<algorithm> #include<cstring> #define ll long long const int maxn=100005; #define pb push_back using namespace std; vector<int> g[maxn]; map<int,int> ban[maxn]; int q[maxn],tp,tl,ans=0; int id[maxn],hd[maxn],n,m,Q; int to[maxn*4],ne[maxn*4],d[maxn]; bool v[maxn]; inline void BFS(){ d[1]=0,v[1]=1,q[tp=tl=1]=1; int x; while(tp<=tl){ x=q[tp++]; for(int i=hd[x];i;i=ne[i]) if(!v[to[i]]){ v[to[i]]=1,d[to[i]]=d[x]+1; q[++tl]=to[i]; } } } inline void build(){ for(int i=1;i<=n;i++) for(int j=hd[i];j;j=ne[j]) if(d[i]+1==d[to[j]]){ g[i].pb(to[j]); id[to[j]]++; } } inline void prework(){ BFS(); build(); } inline void work(int x){ int T; q[tp=tl=1]=x; while(tp<=tl){ x=q[tp++],ans++; for(int i=g[x].size()-1;i>=0;i--){ T=g[x][i]; if(!ban[x].count(T)){ ban[x][T]=1,id[T]--; if(!id[T]) q[++tl]=T; } } } } inline void solve(){ memset(v,0,sizeof(v)); int uu,vv,pos; while(Q--){ scanf("%d",&pos),uu=to[pos],vv=to[pos+m]; if(d[uu]>d[vv]) swap(uu,vv); if(d[uu]+1==d[vv]) if(!ban[uu].count(vv)){ ban[uu][vv]=1; id[vv]--; if(!id[vv]) work(vv); } printf("%d\n",ans); } } int main(){ scanf("%d%d%d",&n,&m,&Q); int uu,vv; for(int i=1;i<=m;i++){ scanf("%d%d",&uu,&vv); to[i]=vv,ne[i]=hd[uu],hd[uu]=i; to[i+m]=uu,ne[i+m]=hd[vv],hd[vv]=i+m; } prework(); solve(); return 0; }
??????