poj1094Sorting It All Out

本文探讨了一种使用深度优先搜索(DFS)解决图遍历问题的方法,并尝试判断图中是否存在环及确定节点间的顺序关系。由于递归实现导致时间效率低下,最终转向采用拓扑排序方法实现了0ms AC的成绩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚遇到这道题时我就想着把它建立成一个图,然后每输入一条边就就深度遍历一下。

判断是否有环和是否能判断出大小顺序。。。

但是之后才知道一般递归都很耗时间。。。

尽管我加入了几个强大的剪枝。而且在discuss里面的数据都通过了。

不过还是超时。。。。

我特别注明一下,下面的代码是超时的代码额!!

希望大神能帮我修改一下ac。。小弟感激不尽!!!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int map[30][30];
int chvist[30],order[30],isnothead[30],rudu[30];
int n,m,vist[30],num;
int DFS(int j,int layer,int xx[])
{
	//vist[j] = 1;
	xx[layer] = j;
	if(layer == n-1)
	{
		for(int j=0;j<n;j++)
			order[j] = xx[j];
		return 1;
	}
	
	for(int i=0;i<n;i++)
		if(map[j][i])
		{
			if(!vist[i])
			{
				vist[i] = 1;
				int ab = DFS(i,layer+1,xx);
				vist[i] = 0;
				if(ab != 0)
					return ab;
			}
			else
				return -1;
		}
		return 0;
}
int main()
{
	char ch[5];
	int xx[30];
	
	while(scanf("%d%d",&n,&m) && n && m)
	{
		int isnotco = 1;
		int ring_or_order,times;
		memset(map,0,sizeof(map));
		memset(chvist,0,sizeof(chvist));
		memset(isnothead,0,sizeof(isnothead));
		memset(rudu,0,sizeof(rudu));
		for(int i=0;i<m;i++)
		{
		scanf("%s",ch);
		chvist[ch[0]-'A'] = 1;
		chvist[ch[2]-'A'] = 1;
		rudu[ch[2]-'A']++;
		if(ch[1] == '<')
		{
			map[ch[0]-'A'][ch[2]-'A'] = 1;
			isnothead[ch[0]-'A'] = 1;
			isnothead[ch[2]-'A'] = 0;
		}
		else
		{
			map[ch[1]-'A'][ch[0]-'A'] = 1;
			isnothead[ch[0]-'A'] = 0;
			isnothead[ch[2]-'A'] = 1;
		}
		int rudunum = 0;
		for(int tt=0;tt<n;tt++)
			if(rudu[tt]==0)
				rudunum++;

		for(int j=0;j<n;j++)
			if(chvist[j] && isnotco && isnothead[j]==1 && rudunum==1)
			{
				num = 0;
				memset(vist,0,sizeof(vist));
				vist[j] = 1;
		         int flag = DFS(j,0,xx);
				 if(flag == -1)
				 {
					 isnotco = 0;
					 ring_or_order = 1;
					 times = i+1;

				 }
				 else if(flag == 1)
				 {
					 isnotco = 0;
					 ring_or_order = 2;
					 times = i+1;
				 }

			}
		}
		if(isnotco)
			printf("Sorted sequence cannot be determined.\n");
		else
		{
			if(ring_or_order==1)
				printf("Inconsistency found after %d relations.\n",times);
			else
			{
				printf("Sorted sequence determined after %d relations: ",times);
				for(int s=0;s<n;s++)
					printf("%c",order[s]+'A');
				printf(".\n");
			}

		}


	}
	return 0;
}
	


下面是用拓扑排序0ms  ac的链接。。前辈的

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值