poj1094

Sorting It All Out

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 19054 Accepted: 6511

Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

Output

For each problem instance, output consists of one line. This line should be one of the following three:

Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.

Sample Input

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.
 
我被我自己恶心倒了,这题思路很简单
就是topsort,但要判断环
判断环可以用拓扑排序判断,如果topsort不能遍历所有的点就说明存在环
也可以用dfs判断,如果在dfs过程中遍历到已经遍历的节点,那肯定存在环
这里给出个简单的dfs
 1int dfs(int u)
 2{
 3    int ii;
 4    if (x==u) return 1;
 5    for (ii=1; ii<=num[u] ; ii++ )
 6    {
 7        if (dfs(map[u][ii])==1)
 8            return 1;
 9    }

10    return 0;
11}
//x是遍历的初始节点,这个dfs可以继续优化

我刚开始想可以topsort之后再判断环,但是我就被自己恶心到了
我写的topsort中如果出现不能确定的情况就退出
那么这样就不知道有没有环了,
我还用了一个巨恶心的标志flag
这个flag让我wa了无数次,题目我也不太明白刚开始
我误以为如果前面几条能判断出那三种情况之一的话就不用管后面的了,其实不然,如果目前不确定的话,那还应该继续判断下去
直到出现了矛盾(环)或者能确定出唯一的topsort的情况
还有我在查环的时候把dfs过程放在了topsort里面,其实本意是只要查一边就行了
但是我在写的时候每个点都dfs一遍,这样时间就爆了,
不得已,改在init里面了
这道题终于艰难的A掉了
  1#include<stdio.h>
  2#include<string.h>
  3#include<math.h>
  4#define MAX 30
  5int degree[MAX],degree1[MAX];
  6int map[MAX][MAX];
  7int num[MAX],stack[MAX],top;
  8int n,m,len,flag,ans;
  9int seq[27],fff;
 10int used,x,y;
 11short ff[27];
 12void push(int i)
 13{
 14    top++;
 15    stack[top]=i;
 16}

 17int pop()
 18{
 19    top--;
 20    return stack[top+1];
 21}

 22int dfs(int u)
 23{
 24    int ii;
 25    if (x==u) return 1;
 26    for (ii=1; ii<=num[u] ; ii++ )
 27    {
 28        if (dfs(map[u][ii])==1)
 29            return 1;
 30    }

 31    return 0;
 32}

 33void topsort()
 34{
 35    int i,j,now;
 36    len=0;
 37    top=0;
 38    for (i=1; i<=n ; i++ )
 39        if(ff[i]==1&&degree[i]==0)
 40            push(i);
 41    if (top>1&&used==n)
 42    {
 43        flag=-1;
 44        return;
 45    }

 46    while (top)
 47    {
 48        now=pop();
 49        len++;
 50        seq[len]=now;
 51        for (i=1; i<=num[now] ; i++ )
 52        {
 53            degree[map[now][i]]--;
 54            if (degree[map[now][i]]==0)
 55            {
 56                push(map[now][i]);
 57            }

 58            if (top>1&&used==n)
 59            {
 60                flag=-1;
 61                return;
 62            }

 63        }

 64    }

 65    if (len<used)
 66    {
 67        flag=1;
 68        return;
 69    }

 70    if (len==n)
 71    {
 72        flag=2;
 73        return;
 74    }

 75}

 76void print()
 77{
 78    int i;
 79    if (flag==1)
 80    {
 81        printf("Inconsistency found after %d relations.\n",ans);
 82        return;
 83    }

 84    if (flag==-1)
 85    {
 86        printf("Sorted sequence cannot be determined.\n");
 87        return;
 88    }

 89    if (flag==2)
 90    {
 91        printf("Sorted sequence determined after %d relations: ",ans);
 92        for (i=1; i<=n ; i++ )
 93        {
 94            printf("%c",seq[i]+64);
 95        }

 96        printf(".\n");
 97        return;
 98    }

 99}

100void init()
101{
102    char tmp[3];
103    int i,j,a,b;
104    memset(ff,0,sizeof(ff));
105    memset(degree1,0,sizeof(degree1));
106    memset(num,0,sizeof(num));
107    memset(map,0,sizeof(map));
108    flag=0;
109    used=0;
110    for (i=1; i<=m ; i++ )
111    {
112        scanf("%s",&tmp);
113        a=tmp[0]-64;
114        if (!ff[a])
115        {
116            used++;
117            ff[a]=1;
118        }

119        b=tmp[2]-64;
120        if (!ff[b])
121        {
122            used++;
123            ff[b]=1;
124        }

125        x=a;
126        if ((flag==0||flag==-1)&&(dfs(b)==1))
127        {
128            flag=1;
129            ans=i;
130        }

131        if (flag==0||flag==-1)
132        {
133            degree1[b]++;
134            num[a]++;
135            map[a][num[a]]=b;
136            for (j=1; j<=n ; j++ )
137            {
138                degree[j]=degree1[j];
139            }

140            topsort();
141            ans=i;
142        }

143    }

144    if (flag==0&&used<n)
145    {
146        flag=-1;
147        return;
148    }

149}

150int main()
151{
152    scanf("%d%d",&n,&m);
153    while (!(n==0&&m==0))
154    {
155        init();
156        print();
157        scanf("%d%d",&n,&m);
158    }

159    return 0;
160}

161

posted on 2012-02-16 12:25 jh818012 阅读(120) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

文章档案(85)

搜索

最新评论