类 Tarjan 15pts 做法求 hack
查看原帖
类 Tarjan 15pts 做法求 hack
322620
Nygglatho楼主2024/9/7 21:38

RT。思路就是 Tarjan 求割点 + 判断度为 1 点

但是 WA 15pts,基环树全 WA/fad

#include "bits/stdc++.h"
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long

#define OPEN freopen ("t3.in", "r", stdin); freopen ("t3.out", "w", stdout);
#define DATA freopen ("t3.in", "w", stdout);

#define pc __builtin_popcount
#define db double
#define pii pair<int, int>
#define fi first
#define se second

#define F(i,x,y) for (int i = (x); i <= (y); ++i)
#define D(i,x,y) for (int i = (x); i >= (y); --i)

using namespace std;

const int inf = 0x7fffffff;
// const ll mod = 998244353ll;
const ll mod = 1ll * 1e9 + 7ll;

namespace FastIO {
	inline void Rd(int& x) {
		int f = 1;
		x = 0;
		char c = getchar();
		while (c < '0' || c > '9') {
			if (c == '-') f = -1;
			c = getchar();
		}
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c - 48), c = getchar();
		x *= f;
	}

	inline void Wt(int x) {
		if (x < 10) {
			putchar(x + 48);
			return;
		}
		Wt(x / 10);
		putchar((x % 10) + 48);
	}
}

namespace Maths {
	ll fac[560000];

	void init() {

		fac[0] = 1ll;

		F(i, 1, 500000) fac[i] = fac[i - 1] * i % mod;
	}

	ll qpow(ll x, ll y) {
		if (y == 0ll) return 1ll;

		ll w = qpow(x, y / 2ll);

		if (y % 2ll) return (w * w % mod) * x % mod;
		else return w * w % mod;
	}

    ll qpow(ll x, ll y, ll p) {
        if (y == 0ll) return 1ll;
        ll w = qpow(x, y / 2ll, p);
        if (y % 2ll) return (w * w % p) * x % p;
        else return w * w % p;
    }

	inline ll C(ll x, ll y) {
		return (fac[x] * qpow(fac[y], mod - 2ll) % mod) * qpow(fac[x - y], mod - 2ll) % mod;
	}

	inline ll div(ll x) {
		return qpow(x, mod - 2ll);
	}
}

struct Edge {
	int to, nxt, tree;
}e[680000];

int hd[680000], cnt, ct, n, m;
int d[680000];
int dfn[680000], low[680000], _dfn, ans[680000];

void addedge(int u, int v) {
	++ cnt;
	e[cnt].to = v;
	e[cnt].nxt = hd[u];
	e[cnt].tree = 0;
	hd[u] = cnt ;
}

void tarjan(int now) {
	dfn[now] = low[now] = ++ _dfn;
	
	for (int i = hd[now]; i; i = e[i].nxt) {
		int v = e[i].to;
		if (dfn[v]) {
			low[now] = min(low[now], dfn[v]);
		} else {
			e[i].tree = 1;
			tarjan(v);
			low[now] = min(low[now], low[v]);
		}
	}
}

int mp[310000];

void Main() {
	cin >> n >> m;
    F(i, 1, n) mp[i] = 0;
    F(i, 1, n) dfn[i] = low[i] = 0;
    _dfn = 0;
    F(i, 1, n) hd[i] = 0; cnt = ct = 0;
    F(i, 1, n) d[i] = 0;
	F(i ,1, m) {
		int u, v;
		cin >> u >> v;
		// cerr<<u<<' '<<v<<'\n';
		addedge(u, v);
		addedge(v, u);
		++ d[u], ++ d[v];
	} 
    F(i, 1, n) {
		int flg = 0;
		if (! dfn[i]) flg = 1, tarjan(i);
		if (flg) {
			// cerr<<i<<'\n';
			if (i != 1) {
                cout << "-1\n"; return ;
            }
			int tot = 0;
			for (int j = hd[i]; j; j = e[j].nxt) {
				if (e[j].tree == 1) ++ tot;
			}
			if (tot > 1) ans[++ ct] = i;
		} else {
			for (int j = hd[i]; j; j = e[j].nxt) {
				if (e[j].tree == 1 && low[e[j].to] >= dfn[i]) {
					ans[++ ct] = i;
					break;
				}
			}
		}
	}
    F(i, 1, ct) mp[ans[i]] = 1;
    // F(i,1,n)cerr<<mp[i]<<' ';cerr<<'\n';

    int flg = 0;

    F(i, 1, n) {
        if (! mp[i] && d[i] != 1) flg = i;
    }

    if (flg == 0) {
        cout << "-1\n";
        return ;
    }

    F(i, 1, n) {
        if (i == flg) cout << "B";
        else cout << "W";
    }
    cout << "\n";
}

int main() {

    IOS
    int T; cin >> T; while (T --) Main();
}
2024/9/7 21:38
加载中...