刚遇到这道题时我就想着把它建立成一个图,然后每输入一条边就就深度遍历一下。
判断是否有环和是否能判断出大小顺序。。。
但是之后才知道一般递归都很耗时间。。。
尽管我加入了几个强大的剪枝。而且在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的链接。。前辈的