rt,想知道为什么会厌氧。
代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=0,f=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f?-x:x;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+48);
}
const int N=3e6+2023;
int n,m,a[N],b[N],head[N],cnt,tot,dfn[N],low[N],l,k;
vector<int>x,y;
struct node{
int next,to,from;
}e[N<<1];
void add(int u,int v) {
e[++cnt].next=head[u];
e[cnt].from=u;
e[cnt].to=v;
head[u]=cnt;
}
void Tarjan(int now,int fa) {
dfn[now]=low[now]=++tot;
for (int i=head[now];i;i=e[i].next) {
if (!dfn[e[i].to]) {
Tarjan(e[i].to,now);
low[now]=min(low[e[i].to],low[now]);
if (low[e[i].to]>dfn[now]) {
if (!a[e[i].to]||!b[e[i].to]||a[e[i].to]==k||b[e[i].to]==l) {
x.push_back(e[i].from);
y.push_back(e[i].to);
}
}
a[now]+=a[e[i].to]; b[now]+=b[e[i].to];
}
else if (e[i].to!=fa) {
low[now]=min(low[now],dfn[e[i].to]);
}
}
}
signed main(){
n=read(); m=read(); k=read(); l=read();
for (int i=1;i<=k;++i) {
int x=read();
a[x]=1;
}
for (int i=1;i<=l;++i) {
int x=read();
b[x]=1;
}
for (int i=1;i<=m;++i) {
int x=read(),y=read();
add(x,y); add(y,x);
}
for (int i=1;i<=n;++i) {
if (!dfn[i]) Tarjan(i,0);
}
cout<<x.size()<<"\n";
for (int i=0;i<x.size();++i) {
cout<<x[i]<<" "<<y[i]<<"\n";
}
return 0;
}