WA了三个点,先放在这里,以待高人。
查看原帖
WA了三个点,先放在这里,以待高人。
429572
喵喵喵__楼主2021/5/25 16:05

代码如下:

#pragma warning(disable:4996)
#include<cstdlib>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdbool.h>
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
const int MAXn = 1e4 + 5;
const int MAXm = 5e4 + 5;
int read() {
	int w = 0, r = 0; char ch = getchar();
	while (ch < '0' || ch >'9')w |= ch == '-', ch = getchar();
	while (ch >= '0' && ch <= '9')
		r = (r << 1) + (r << 3) + (ch ^ 48), ch = getchar();
	return w ? ~r + 1 : r;
}

int n, m, tot;
int head[MAXn], cnt;
struct Edge {
	int u, v, next;
}ed[MAXm<<1];
void add(int u, int v) {
	ed[cnt].u = u;
	ed[cnt].v = v;
	ed[cnt].next = head[u];
	head[u] = cnt++;
	return;
}

int dfn[MAXn], low[MAXn], id;
int col[MAXn], color, sta[MAXn], top;
bool vis[MAXn], bridge[MAXm<<1];
void Tarjan1(int x, int in_edge) {
	dfn[x] = low[x] = ++id;
	for (int i = head[x]; ~i; i = ed[i].next) {
		int v = ed[i].v;
		if (dfn[v] == 0) {
			Tarjan1(v, i);
			low[x] = min(low[x], low[v]);
			if (low[v] >= dfn[x]) {
				bridge[i] = bridge[i ^ 1] = true;
			}
		}
		else if (i != (in_edge^1)) {
			low[x] = min(low[x], dfn[v]);
		}
	}
}
void dfs(int x) {//染色
	col[x] = color;
	for (int i = head[x]; ~i; i = ed[i].next) {
		int v = ed[i].v;
		if (col[v] || bridge[i])continue;
		dfs(v);
	}
}

int hea2[MAXn], cn2;
int hea3[MAXn], cn3;
struct Edg {
	int u, v, next, val;
}ed2[MAXm<<1], ed3[MAXm<<1];
void add2(int u, int v) {
	ed2[++cn2].u = u;
	ed2[cn2].v = v;
	ed2[cn2].next = hea2[u];
	hea2[u] = cn2;
}
void add3(int u, int v) {
	ed3[cn3].u = u;
	ed3[cn3].v = v;
	ed3[cn3].next = hea3[u];
	hea3[u] = cn3++;
}

int fa[MAXn];
int F(int x) {
	return x == fa[x] ? x : fa[x] = F(fa[x]);
}
int dep[MAXn], lca[MAXn];
bool v2[MAXn];
void Tarjan2(int x, int f) {//初始化
	v2[x] = true;
	dep[x] = dep[f] + 1;
	for (int i = hea2[x]; i; i = ed2[i].next) {
		int v = ed2[i].v;
		if (v2[v] == 0 && f != v) {
			Tarjan2(v, x);
			fa[v] = x;
		}
	}
	for (int i = hea3[x]; ~i; i = ed3[i].next) {
		int v = ed3[i].v, u = ed3[i].u;
		if (v2[v] && ed3[i].val == 0) {
			ed3[i].val = dep[u] + dep[v] - 2 * dep[F(v)] + 1;
			//printf("TARJAN2 %d %d %d %d %d\n", i/2, dep[u], dep[v], dep[F(v)], ed3[i].val);
			ed3[i ^ 1].val = ed3[i].val;
			lca[i / 2] = fa[v];
		}
	}
}

void checkout() {
	for (int i = 0; i < cnt; i++) {
		printf("原边 %d %d\n", ed[i].u, ed[i].v);
	}
	for (int i = 1; i <= cn2; i++) {
		printf("新边 %d %d\n", ed2[i].u, ed2[i].v);
	}
	for (int i = 0; i < cn3; i++) {
		printf("询问 %d %d 颜色 %d %d\n", ed3[i].u, ed3[i].v, col[ed3[i].u], col[ed3[i].v]);
	}
	for (int i = 1; i <= n; i++) {
		printf("颜色 i %d col %d\n", i, col[i]);
	}
	for (int i = 1; i <= n; i++) {
		printf("深度 i %d dep %d\n", i, dep[i]);
	}
	for (int i = 0; i < cn3; i+=2) {
		printf("询问祖先 %d lca %d %d\n", i, lca[i / 2], lca[(i ^ 1) / 2]);
	}
}

void prin(int x) {
	if (x == 0) {
		putchar('0');
		return;
	}
	else if (x == 1) {
		putchar('1');
		return;
	}
	prin(x >> 1);
	char ch = x % 2 + 48;
	putchar(ch);
	return;
}

int main() {
	n = read(); m = read();
	memset(head, -1, sizeof head);
	memset(hea3, -1, sizeof hea3);
	for (int i = 1; i <= n; i++)fa[i] = i;
	for (int i = 1; i <= m; i++) {
		int p1 = read(), p2 = read();
		add(p1, p2);
		add(p2, p1);
	}
	//tot = read();
	//for (int i = 1; i <= tot; i++) {
	//	int p1 = read(), p2 = read();
	//	add3(p1, p2);
	//	add3(p2, p1);
	//}
	for (int i = 1; i <= n; i++) {
		if (dfn[i] == 0)Tarjan1(i, -1);//这个零 真有意思
	}
	for (int i = 1; i <= n; i++) {
		if (col[i] == 0) {
			++color;
			dfs(i);
		}
	}
	for (int i = 0; i < cnt; i+=2) {
		int u = ed[i].u, v = ed[i].v;
		if (col[u] != col[v]) {
			add2(col[u], col[v]);
			add2(col[v], col[u]);
		}
	}
	tot = read();
	for (int i = 1; i <= tot; i++) {
		int p1 = read(), p2 = read();
		add3(col[p1], col[p2]);
		add3(col[p2], col[p1]);
	}
	//dep[1] = 1;
	Tarjan2(1, 1);

	//checkout();
	//for (int i = 0; i < tot; i++) {
	//	char ch[35];
	  //  itoa(ed3[2*i].val, ch, 2);
		//printf("%s\n", ch);
	//}

	for (int i = 0; i < tot; i++) {
		prin(ed3[2 * i].val);
		putchar('\n');
	}
	return 0;
}
2021/5/25 16:05
加载中...