The Way of C++

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 19 Comments :: 0 Trackbacks

公告

The first time i use this blog, i will write something that i learn which i think is worth write down.

常用链接

留言簿(3)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

使用深搜,根据每个结点的结束访问时间的降序对结点进行拓扑排序,如果在某个结点的扩展过程中发现反向边,则出现了矛盾;否则对所得到的结点序列,进行一次遍历,对于相邻的结点检测是否存在连接边(存在则表示它们的顺序已经可以确定),如果所有的相邻结点都可确定顺序,则这个序列是完全有序的,对于后面的输入可以忽略;如果处理完所有的输入还不能得到完全有序序列,则输出序列顺序不能确定。
题意实际上暗示了对每一次输入都要做处理,如果对于某一次输入已经能确定序列矛盾或者序列完全有序,则可以忽略后面的输入。


 1
 #include<stdio.h>
 2 #include<string.h>
 3 int n,m;
 4 int e[27][27];
 5 char in[4];
 6 char temp[27];
 7 int cur;
 8 int incons;
 9 int color[27];
10 void dfs(int k)
11 {
12     color[k]=1;
13     int i;
14     for(i=1;i<=n;++i)
15     {
16         if(e[k][i]&&color[i]==0) dfs(i);
17         else if(e[k][i]&&color[i]==1) incons=1//reverse edge exist, inconsistency found
18     }
19     color[k]=2;
20     temp[cur++]=k-1+'A';
21 }
22 int main()
23 {
24     int i,j,found;
25     while(scanf("%d%d",&n,&m)&&n&&m)
26     {
27         memset(e,0,sizeof(e));
28         found=0;
29         incons=0;
30         for(i=1;i<=m;++i)
31         {
32             scanf("%s",in);
33             e[in[0]-'A'+1][in[2]-'A'+1]=1;
34             if(!found&&!incons)
35             {
36                 cur=0;
37                 memset(color,0,sizeof(color));
38                 for(j=1;j<=n;++j)
39                     if(color[j]==0) dfs(j);
40                 temp[cur]='\0';
41                 if(incons==1//inconsistency found
42                     incons=i;
43                 else{
44                     int bb=1;
45                     for(j=cur-1;j>0;--j) //check if the sort of sequence can be confirmed
46                         if(!e[temp[j]-'A'+1][temp[j-1]-'A'+1]) {bb=0;break;}
47                     if(bb) found=i; // sorted sequence determined
48                 }
49             }
50         }
51         char tt;
52         for(i=0,j=cur-1;i<j;i++,j--)  //reverse the sorted sequence
53         {
54             tt=temp[i];
55             temp[i]=temp[j];
56             temp[j]=tt;
57         }
58         if(incons) printf("Inconsistency found after %d relations.\n",incons);
59         else if(found) printf("Sorted sequence determined after %d relations: %s.\n",found,temp);
60         else printf("Sorted sequence cannot be determined.\n");
61     }
62     return 1;
63 }
64 
posted on 2010-04-20 15:42 koson 阅读(603) 评论(0)  编辑 收藏 引用 所属分类: ACM

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