其实这道题用大法师+set就可以AC。。。
#include <iostream>
#include <vector>
#include <cstring>
#include <set>
#define N 10010
using namespace std;
int n,m,p,q,a,b;
bool vis[N];
vector<int> ga[N],gb[N];
set<int> st;
void dfs(int p,int t){
if(vis[p])return;vis[p]=true;st.insert(p);
if(t==1){
for(auto i:ga[p])dfs(i,t);
}
else{
for(auto i:gb[p])dfs(i,t);
}
}
int main(){
cin>>n>>m>>p>>q;
while(p--){
int x,y;
cin>>x>>y;
if(x==y)continue;
ga[x].push_back(y);
ga[y].push_back(x);
}
while(q--){
int x,y;
cin>>x>>y;
if(x==y)continue;
gb[-x].push_back(-y);
gb[-y].push_back(-x);
}
dfs(1,1);
memset(vis,false,sizeof(vis));
a=st.size();
/*for(auto i:st)cout<<i<<' ';
cout<<endl;*/
st=set<int>();
dfs(1,2);
b=st.size();
/*for(auto i:st)cout<<i<<' ';
cout<<endl;*/
cout<<min(a,b)<<endl;
}