题解
暴力搜索
搜索显然会TLE
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<queue> using namespace std; typedef long long ll; inline int read() { int ans=0; char last=' ',ch=getchar(); while(ch<'0'||ch>'9') last=ch,ch=getchar(); while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar(); if(last=='-') ans=-ans; return ans; } const int maxn=1e5+10; struct node{ int to,nxt; }edge[maxn*2]; int head[maxn],cnt=0; int n,m,q; bool vis[maxn];//节点i是否与1直接相连 int son[1005][1005]; int num[1005]; void addedge(int u,int v) { edge[++cnt].to =v;edge[cnt].nxt =head[u];head[u]=cnt; edge[++cnt].to =u;edge[cnt].nxt =head[v];head[v]=cnt; } void dfs(int sum,int u) { if(sum<0) return; if(num[1]==0) return; for(int v,i=1;i<=son[u][0];i++){ v=son[u][i]; num[v]=min(num[v],sum); dfs(sum-1,v); } } int main() { n=read();m=read();q=read(); vis[1]=1; for(int u,v,i=1;i<=m;i++){ u=read();v=read(); if(u==1) vis[v]=1; if(v==1) vis[u]=1; son[u][++son[u][0]]=v; son[v][++son[v][0]]=u; addedge(u,v); addedge(v,u); } for(int a,l,t=1;t<=q;t++){ memset(num,63,sizeof(num)); a=read();l=read(); if(l==1){ if(a==1||(!vis[a])) { printf("No\n"); continue; } else if(vis[a]&&a!=1) { printf("Yes\n"); continue; } }else{ num[a]=l; dfs(l-1,a); if(num[1]==0) printf("Yes\n"); else printf("No\n"); } } return 0; }