?????? P1710 ????????????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了?????? P1710 ????????????相关的知识,希望对你有一定的参考价值。

???????????????   ??????   vector   ??????   turn   ??????   \n   mes   --   

????????????

?????????O2????????????????????????

????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????N????????????????????????M???????????????????????????????????????

?????????????????????????????????A??????B?????????????????????????????????????????????????????????????????????????????????????????????1??????????????????????????????A??????B??????????????????????????????????????????????????????

???????????????????????????1??????????????????????????????????????????????????????????????????????????????????????????????????????????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1?????????2??????????????????????????????????????????????????????????????????Q??????

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

???????????????????????????????????????????????????????????????????????????????????????????????????????????????

??????????????????

???????????????

 

????????????????????????N,M,Q???

?????????M????????????2?????????ai,bi,?????????i??????????????????????????????i?????????????????????

?????????Q????????????????????????rj???????????????????????????????????????

 

???????????????

 

Q??????????????????????????????????????????????????????

 

??????????????????

????????????#1??? 
5 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3
????????????#1??? 
0
2
2
4
4

??????

??????????????????

?????? ??????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;
}

??????

以上是关于?????? P1710 ????????????的主要内容,如果未能解决你的问题,请参考以下文章