1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <iostream> #include <cstdio> using namespace std;
namespace SHAWN { const int N = 2e6 + 7; int head[N], cnt; struct edge { int to, next; }edge[N]; int n, m, a, b, tim, res; int dfn[N], low[N], acnt[N], bcnt[N], par[N]; bool flag[N];
inline void add(int u, int v) { edge[++cnt].next = head[u]; edge[cnt].to = v; head[u] = cnt; }
void Tarjan(int u, int fa) { low[u] = dfn[u] = ++tim; par[u] = fa; for (int i = head[u]; i; i = edge[i].next) { int v = edge[i].to; if (!dfn[v]) { Tarjan(v, u); low[u] = min(low[u], low[v]); if (low[v] > dfn[u]) { if (!acnt[v] || !bcnt[v] || acnt[v] == a || bcnt[v] == b) { flag[v] = true; ++res; } } acnt[u] += acnt[v]; bcnt[u] += bcnt[v]; } else if (dfn[v] < dfn[u] && fa != v) { low[u] = min(low[u], dfn[v]); } } } int work() { cin >> n >> m >> a >> b; for (int i = 1, x; i <= a; ++i) { cin >> x; acnt[x] = 1; } for (int i = 1, x; i <= b; ++i) { cin >> x; bcnt[x] = 1; } for (int i = 1, x, y; i <= m; ++i) { cin >> x >> y; add(x, y); add(y, x); } Tarjan(1, 0); cout << res << '\n'; for (int i = 1; i <= n; ++i) { if (flag[i]) { cout << i << ' ' << par[i] << '\n'; } } return 0; } }
signed int main() { ios :: sync_with_stdio(false); cin.tie(nullptr); return SHAWN :: work(); }
|