求分析这版AC代码的时间复杂度
查看原帖
求分析这版AC代码的时间复杂度
575363
revolutionary_oier楼主2023/9/24 22:25
#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=1e5+10;
const int maxm=2e5+10;
const int inf=1e15;
int n,m,q,cnt;
int head[maxn],que[maxn],dis0[maxn],dis1[maxn];
bool vis[maxn];
struct node{
	int v,nxt;
}e[maxm];
inline void add(int u,int v){
	e[++cnt].v=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
inline void input(){
	scanf("%lld%lld%lld",&n,&m,&q);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%lld%lld",&u,&v);
		add(u,v);
		add(v,u);
	}
}
inline void bfs(){
	for(int i=1;i<=n;i++)dis0[i]=inf;
	int l=0,r=0;
	vis[1]=true;
	que[r++]=1;
	dis0[1]=0;
	while(l<r){
		int x=que[l++];
		queue<int>s;
		for(int i=head[x];i;i=e[i].nxt){
			int v=e[i].v;
			s.push(v);
		}
		while(!s.empty()){
			int t=s.front();
			s.pop();
			for(int i=head[t];i;i=e[i].nxt){
				int v=e[i].v;
				if(!vis[v]){
					vis[v]=true;
					dis0[v]=dis0[x]+2;
					que[r++]=v;
				}
			}
		}
	}
} 
inline void bfs1(){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++)dis1[i]=inf;
	int l=0,r=0;
	for(int i=head[1];i;i=e[i].nxt){
		int v=e[i].v;
		vis[v]=true;
		que[r++]=v;
		dis1[v]=1;
	}
	while(l<r){
		int x=que[l++];
		queue<int>s;
		for(int i=head[x];i;i=e[i].nxt){
			int v=e[i].v;
			s.push(v);
		}
		while(!s.empty()){
			int t=s.front();
			s.pop();
			for(int i=head[t];i;i=e[i].nxt){
				int v=e[i].v;
				if(!vis[v]){
					vis[v]=true;
					dis1[v]=dis1[x]+2;
					que[r++]=v;
				}
			}
		}
	}
}
inline void calculate(){
	bfs();
	bfs1();
//	for(int i=1;i<=5;i++)printf("%d = %d %d\n",i,dis0[i],dis1[i]);
}
inline void solve(){
	while(q--){
		int p,w;
		scanf("%lld%lld",&p,&w);
		if(dis0[p]>w&&dis1[p]>w){
			printf("No\n");
			continue;
		}
		if(((dis0[p]-w)%2==0&&dis0[p]<=w)||((dis1[p]-w)%2==0&&dis1[p]<=w))printf("Yes\n");
		else printf("No\n");
	}
}
signed main(){
	input();
	calculate();
	solve();
	return 0;
} 

本人猜测 O(n+2⋅m)O(n+2\cdot m) 求大佬分析

2023/9/24 22:25
加载中...