MLE求助
查看原帖
MLE求助
567484
ostresc楼主2024/11/26 21:04

rt

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define gc() getchar()
inline int read()
{
	int x = 0;
	char ch = gc();
	while (!isdigit(ch)) ch = gc();
	while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
	return x;
}
const int N = 500005;
int n, m, ans[N], cnt, f[N], tmp;
int head[N], nxt[N << 1], vel[N << 1], tot;
bool flag, rings[N], trc, vis[N];
struct Point
{
	int x, y;
}a[N << 1];

bool cmp(Point M1, Point M2)
{
	return M1.y > M2.y;
}

void add(int x, int y)
{
	nxt[++tot] = head[x];
	head[x] = tot;
	vel[tot] = y;
}

void dfs1(int x)
{
	vis[x] = 1;
	ans[++cnt] = x;
	for (int i = head[x]; i; i = nxt[i])
	{
		int y = vel[i];
		if (!vis[y])
			dfs1(y);
	}
}

void dfsRing(int x, int fa)
{
	if (flag)
		return;
	if (!f[x])
	{
		f[x] = fa;
	}
	else if (f[x] != fa)
	{
		while (fa != x)
			rings[fa] = 1, fa = f[fa];
		rings[x] = 1, flag = 1;
		return;
	}
	for (int i = head[x]; i; i = nxt[i])
	{
		int y = vel[i];
		if (y != fa)
			dfsRing(y, x);
	}
}

void dfs(int x)
{
	ans[++cnt] = x;
	vis[x] = 1;
	if (!rings[x])
	{
		for (int i = head[x]; i; i = nxt[i])
		{
			int y = vel[i];
			if (vis[y])
				continue;
			dfs(y);
		}
		return;
	}
	bool fl = 0;
	for (int i = head[x]; i; i = nxt[i])
	{
		if (trc)
			break;
		int y = vel[i];
		if (vis[y])
			continue;
		if (rings[y])
		{
			i = nxt[i];
			while (vis[vel[i]])
				i = nxt[i];
			if (i)
				tmp = vel[i];
			else if (y > tmp)
				trc = fl = 1;
			break;
		}
	}
	for (int i = head[x]; i; i = nxt[i])
	{
		int y = vel[i];
		if (vis[y])
			continue;
		if (rings[y] && fl)
			continue;
		dfs(y);
	}
}

int main()
{
	n = read(), m = read();
	for (int i = 1; i <= m; i++)
	{
		int u = read(), v = read();
		a[i].x = a[i + m].y = u;
		a[i].y = a[i + m].x = v;
	}
	sort (a + 1, a + 1 + m + m, cmp);
	for (int i = 1; i <= m + m; i++)
		add(a[i].x, a[i].y);
	if (m == n - 1)
	{
		dfs1 (1);
		for (int i = 1; i <= n; i++)
			printf("%d ", ans[i]);
		return 0;
	}
	dfsRing(1, 0);
	tmp = 0x3f3f3f3f;
	dfs(1);
	for (int i = 1; i <= n; i++)
		printf("%d ", ans[i]);
	return 0;
}
2024/11/26 21:04
加载中...