竞赛讨论区 > 求教j题为什么只能过百分之30呀
头像
TJ_ovo
编辑于 2023-02-02 22:04 河北
+ 关注

求教j题为什么只能过百分之30呀

跪求一组hack数据

大概的思路就是每次统计入度为0的点的数量为cnt,如果cnt==1则push进ans,如果不为1则push cnt个-1进ans

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<queue>
#include<math.h>
#include<string>
#include<map>
#include<vector>

using namespace std;

int deg[1005];
int out[1005];

int visit[1005];

vector<int>res;

vector<int>adj[1005];

queue<int>q;

int N,M;

int fa[1005];

int findx(int x)
{
	while (fa[x] != x)
	{
		x = fa[x];
	}
	return x;
}


int main(void)
{
	cin >> N >> M;

	int i;

	for (i = 1; i <= N; i++)
	{
		fa[i] = i;
	}

	for (i = 1; i <= M; i++)
	{
		int t1, t2;
		scanf("%d %d", &t1, &t2);
		
		int flags = 1;

		for (auto y : adj[t1])
		{
			if (y == t2)
			{
				flags = 0;
				break;
			}
		}
		if (flags)
		{
			adj[t1].push_back(t2);

			out[t1]++;
			deg[t2]++;

			fa[findx(t1)] = findx(t2);
		}

	}

	

	int flag = 1;
	
	for (i = 1; i <= N; i++)
	{
		if (deg[i]==0&&out[i]==0)
		{
			flag = 0;
		}

	}
	int father = findx(1);
	
	for (i = 2; i <= N; i++)
	{
		if (findx(i) != father)
		{
			flag = 0;
		}

	}



	if (!flag)
	{
		for (i = 0; i < N; i++)
		{
			res.push_back(-1);
		}
	}
	
	if (flag)
	{


		for (int i = 1; i <= N; i++)
		{
			if (deg[i] == 0)
			{
				q.push(i);
			}
		}

		int count = 0;

		while (!q.empty() && count < N)
		{
			

			int cnt = 0;

			for (i = 1; i <= N; i++)
			{
				if (visit[i])
				{
					continue;
				}
				if (deg[i] == 0)
				{
					cnt++;
					visit[i] = 1;
				}
			}
			count += cnt;
			if (cnt == 1)
			{
				int x = q.front();
				q.pop();

				res.push_back(x);

				for (auto y : adj[x])
				{
					if (--deg[y] == 0)
					{
						q.push(y);
					}
				}
			}
			else
			{
				for (i = 0; i < cnt; i++)
				{
					int th = q.front();
					q.pop();
					for (auto y : adj[th])
					{
						
						deg[y]--;
						if (deg[y] == 0)
						{
							q.push(y);
							
						}
					}
					res.push_back(-1);
				}
			}

		
		}
	}


	for (i = 0; i <N-1; i++)
	{
		printf("%d ", res[i]);
	}
	printf("%d", res[N - 1]);

	
	system("pause");
	return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐