码迷,mamicode.com
首页 > 编程语言 > 详细

AcWing 343. 排序

时间:2021-05-04 15:40:20      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:har   size   sizeof   针对   check   namespace   rgb   term   ted   

原题链接

考察:Floyd

思路:

        传递闭包应用题.也可以用拓扑排序,这里先练下传递闭包.拓扑排序以后补

        传递闭包模板:

1 for(int k=1;k<=n;k++)
2     for(int i=1;i<=n;i++)
3         for(int j=1;j<=n;j++)
4             if(g[i][k]&&g[k][j]) g[i][j] = 1;

         矛盾:g[i][i] = 1

         无法确定: g[i][j] = 0 && g[j][i] = 0 (i!=j)

         剩下就是能确定的情况:每次找到<边最多的字母输出即可.标记已经输出的字母.

         每次加一条边,就进行一次Floyd 时间复杂度O(mn3)

        优化: 加一条边,只需要针对那条边进行扩展,其他的上一层已经扩展.时间复杂度O(m*n2)

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int N = 30;
 5 bool g[N][N],st[N];
 6 char s[N];
 7 int n,m;
 8 int check()
 9 {
10     for(int i=1;i<=n;i++)
11       if(g[i][i]) return 1;//1表示矛盾
12     for(int i=1;i<=n;i++)
13       for(int j=i+1;j<=n;j++)
14         if(!g[i][j]&&!g[j][i]) return 0;
15     return 2;
16 }
17 char get()
18 {
19     int maxn = -1;
20     char c;
21     for(int i=1;i<=n;i++)
22     {
23         int cnt = 0;
24         if(st[i]) continue;
25         for(int j=1;j<=n;j++)
26             if(g[i][j]) cnt++;
27         if(cnt>maxn) maxn = cnt,c = i-1+A;
28     }
29     st[c-A+1] = 1;
30     return c;
31 }
32 int main()
33 {
34     while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
35     {
36         int k,type = 0;//第几轮,什么类型
37         memset(g,0,sizeof g);
38         memset(st,0,sizeof st);
39         for(int i=1;i<=m;i++)
40         {
41             scanf("%s",s);
42             int a = s[0]-A+1,b = s[2]-A+1;
43             g[a][b] = 1;
44             if(!type)
45             {
46                 for(int i=1;i<=n;i++)
47                 {
48                     if(g[i][a]) g[i][b] = 1;
49                     if(g[b][i]) g[a][i] = 1;
50                     for(int j=1;j<=n;j++)
51                       if(g[i][a]&&g[b][j]) g[i][j] = 1;
52                 }
53                 type = check();
54                 if(type) k = i;
55             }
56         }
57         if(!type) puts("Sorted sequence cannot be determined.");
58         else if(type==1) printf("Inconsistency found after %d relations.\n",k);
59         else{
60             printf("Sorted sequence determined after %d relations: ",k);
61             for(int i=1;i<=n;i++) printf("%c",get());
62             printf(".\n");
63         }
64     }
65     return 0;
66 }

 

 

        

AcWing 343. 排序

标签:har   size   sizeof   针对   check   namespace   rgb   term   ted   

原文地址:https://www.cnblogs.com/newblg/p/14725460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!