//段错误,,爆空间
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;//空间
int n,m,d,c,q,vis[maxn],g[maxn][maxn];
int ok(int s,int e){
int f=0;
queue<int>q;
q.push(s);
while(!q.empty()){
s=q.front();q.pop();
if(s==e) {f=1;break;}
for(int i=1;i<=n;i++){
if(g[s][i]&&vis[i]){
q.push(i);vis[i]=0;
}
}
}
return f;
}
int main(){
int x,y;
scanf("%d%d%d",&n,&m,&d);
memset(g,0,sizeof(g));
while(m--){
scanf("%d%d",&x,&y);
g[x][y]=g[y][x]=1;
}
while(d--){
scanf("%d%d",&c,&q);
for(int i=1;i<=n;i++)
g[i][c]=g[c][i]=0;
int num=0;
while(q--){
scanf("%d%d",&x,&y);
//怎么走一条路?
memset(vis,1,sizeof(vis));
if(!ok(x,y)) num++;
}
cout<<num<<endl;
}
}
超时
#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
int n,m,d,c,q,vis[maxn],vt[maxn];
int head[maxn],tot=0;
struct node{int v,nxt;} g[maxn<<3];
void adde(int u,int v){
g[++tot]={v,head[u]};
head[u]=tot;
}
int ok(int s,int e){
int f=0;
queue<int>q;
q.push(s);
while(!q.empty()){
s=q.front();q.pop();vis[s]=0;
if(!vt[s]) continue;
if(s==e) {f=1;break;}
for(int i=head[s];i;i=g[i].nxt){
int v=g[i].v;
if(vt[v]&&vis[v]){
q.push(v);vis[v]=0;
}
}
}
return f;
}
int main(){
int x,y;
scanf("%d%d%d",&n,&m,&d);
for(int i=0;i<=n;i++) head[i]=0,vt[i]=1;
while(m--){
scanf("%d%d",&x,&y);
adde(x,y);adde(y,x);
}
while(d--){
scanf("%d%d",&c,&q);
vt[c]=0;
int num=0;
while(q--){
scanf("%d%d",&x,&y);
memset(vis,1,sizeof(vis));
if(!ok(x,y)) num++;
}
cout<<num<<endl;
}
}