RE求调
查看原帖
RE求调
374769
Epi4any楼主2023/7/18 11:29

(我的码风可能比较毒瘤)

#include<cstdio>
#include<algorithm>
#define N 100005
#define M 300005
#define Q 30005
using namespace std;

int n, m, q, x, y, tott, totq, cnt, f[N << 1];
int fa[N<<1], ind[N<<1], vis[N<<1];

struct road {
	int u, v, f;
	bool operator < (const road &a)const {
		return f > a.f;
	}
} r[M];

struct tree {
	int v, f;
	tree *lson, *rson;
}*ht[N << 1], poolt[N << 2];

struct query {
	int v, res;
	query *next, *rev;
}*hq[N << 1], poolq[Q << 1];

void addedgeq(int u, int v) {
	query *p = &poolq[++totq], *q = &poolq[++totq];
	p->v = v;
	p->next = hq[u];
	hq[u] = p;
	p->rev = q;
	q->v = u;
	q->next = hq[v];
	hq[v] = q;
	q->rev = p;
	q->res = p->res = -1;
}

int find(int u) {
	return f[u] == -1 ? u : f[u] = find(f[u]);
}

int find2(int u) {
	return fa[u] == -1 ? u : fa[u] = find2(fa[u]);
}

void kruscal() {
	sort(r + 1, r + m + 1);
	cnt = n;
	for (int i = 1; i <= 2 * n; i++) f[i] = -1;
	for (int i = 1; i <= n; i++) ht[i] = &poolt[tott++], ht[i]->v = i;
	
	for (int i = 1; i <= m; i++) {
		int fu = find(r[i].u), fv = find(r[i].v);
		if (fu != fv) {
			ht[++cnt] = &poolt[tott++];
			ht[cnt]->v = cnt;
			ht[cnt]->f = r[i].f;
			ht[cnt]->lson = ht[fu];
			ht[cnt]->rson = ht[fv];
			f[fu] = cnt;
			f[fv] = cnt;
			ind[fu]++;
			ind[fv]++;
		}
		if (cnt == 2 * n - 1) return ;
	}
}

void dfs(int u) {
	fa[u] = -1;
	vis[u] = 1;
	if (u > n) {
		dfs(ht[u]->rson->v),fa[ht[u]->rson->v] = u;
		dfs(ht[u]->lson->v),fa[ht[u]->lson->v] = u;
	}
	else{
		for (query *p = hq[u]; p; p = p->next) if (vis[p->v] && find(u) == find(p->v))
			p->res = p->rev->res = ht[find2(p->v)]->f;
	}
}

int main() {
	scanf("%d%d", &n, &m);
	scanf("%d", &q);
	for (int i = 1; i <= m; i++) scanf("%d%d%d", &r[i].u, &r[i].v, &r[i].f);
	
	for (int i = 1; i <= q; i++) {
		scanf("%d%d", &x, &y);
		addedgeq(x, y);
	}
	kruscal(); 
	for (int i = 1; i <= 2 * n; i++) fa[i] = -1;
	for (int i = n + 1; i <= cnt; i++) if (!ind[i]) dfs(i);
	
	for (int i = 1; i <= 2 * q; i += 2) printf("%d\n", poolq[i].res);
	return 0;
}
2023/7/18 11:29
加载中...