求助最后一组数据为何会TLE
查看原帖
求助最后一组数据为何会TLE
553309
Computer_Nebuilirion楼主2021/9/14 11:27

rt,先放出我的代码:

/*
思路:
	判断:
	起点:入度 = 出度 - 1
	终点:出度 = 入度 - 1
	普通点: 入度 = 出度 
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm = 200000 + 10;
int n,m,tot,tail = 1;
int ver[maxm],nxt[maxm],head[maxm],ans[maxm],in[maxm],out[maxm],cur[maxm];
int flag[maxm];
struct para{
	int x,y;
}p[maxm];
void edge(int a,int b)
{
	ver[++tot] = b;
	nxt[tot] = head[a];
	head[a] = tot;
}
void dfs(int v)
{
	for(int i = cur[v] ; i ; i = nxt[i])
	{
		if(!flag[i])
		{
			flag[i] = 1;
			cur[v] = nxt[i];
			dfs(ver[i]);
		}
		
	}
	ans[++tail] = v;
}
bool cmp(para a,para b)
{
	return a.y > b.y || (a.y == b.y && a.x > b.x);
}
int main()
{
//	freopen("P7771.in","r",stdin);
//	freopen("test.out","w",stdout);
	memset(flag,0,sizeof(flag));
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d",&p[i].x,&p[i].y);
		out[p[i].x]++;
		in[p[i].y]++;
	}
		
	int st = 0,ed = 0;
	sort(p + 1, p + m + 1,cmp);	
	for(int i = 1; i <= m; i++)
		edge(p[i].x,p[i].y);
		
	for(int i = 1; i <= m; i++)
		cur[i] = head[i];
		
	for(int i = 1; i <= m; i++)
	{
		if(in[i] + 1 == out[i])
		{
			st = i;
			continue;
		}
			
		if(in[i] - 1 == out[i])
		{
			ed = i;
			continue;
		}
		if(abs(in[i] - out[i]) > 1)
		{
			printf("No");
			return 0;
		}
		if(st == 0 && in[i] + 1 == out[i])
		{
			printf("No");
			return 0;
		}
		if(ed == 0 && in[i] - 1 == out[i])
		{
			printf("No");
			return 0;
		}
	}
	if(st == 0 && ed == 0)
		st = 1;

	dfs(st);
	while(tail > 1)
	{
		printf("%d ",ans[tail]);
		tail--;
	}
	return 0;		
}

顺便说一句我偷懒,把所有数组都开成了

2×1052\times10^5大小,不过应该没关系。

但是十号测试点TLE了:(

2021/9/14 11:27
加载中...