zoukankan      html  css  js  c++  java
  • poj1094 Sorting It All Out【floyd】【传递闭包】【拓扑序】

    Sorting It All Out
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions:39731   Accepted: 13975

    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.

    Source

    题意:

    给定关于n个字母的对应优先级关系,问是否可以根据优先级对他们进行排序。并且要求输出是在第几组可以得出结果。

    会有优先级不一致和无法排序的情况。

    思路:

    感觉这题数据很迷啊,m的范围都不给我都不好估计复杂度。

    以及,要注意输出时候的句号。特别是可以sort的时候。

    是一道传递闭包的问题,用邻接矩阵建图,如果$A<B$,则表示$A$到$B$有一条有向边,$g['A']['B'] = 1$

    每次添加一个关系,使用一次floyd计算能否得出结果,或者是否出现不一致。

    输出排序结果的时候,其实只需要比较每个点的入度,按照入度从大到小排序就行了。

    因为最后的矩阵是一个传递闭包,最小的那个字母肯定小于其他所有字母,也就是说他这一行会有$n-1$个$1$

      1 #include<iostream>
      2 //#include<bits/stdc++.h>
      3 #include<cstdio>
      4 #include<cmath>
      5 #include<cstdlib>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<queue>
      9 #include<vector>
     10 #include<set>
     11 #include<climits>
     12 using namespace std;
     13 typedef long long LL;
     14 #define N 100010
     15 #define pi 3.1415926535
     16 #define inf 0x3f3f3f3f
     17 
     18 int n, m;
     19 int g[30][30], tmpg[30][30];
     20 
     21 int floyd()
     22 {
     23     for(int i = 0; i < n; i++){
     24         for(int j = 0; j < n; j++){
     25             tmpg[i][j] = g[i][j];
     26         }
     27     }
     28     for(int k = 0; k < n; k++){
     29         for(int i = 0; i < n; i++){
     30             for(int j = 0; j < n; j++){
     31                 tmpg[i][j] |= tmpg[i][k] & tmpg[k][j];
     32                 if(tmpg[i][j] == tmpg[j][i] && tmpg[i][j] == 1 && i != j){
     33                     return -1;
     34                 }
     35             }
     36         }
     37     }
     38     for(int i = 0; i < n; i++){
     39         for(int j = 0; j < n; j++){
     40             if(tmpg[i][j] == tmpg[j][i] && tmpg[i][j] == 0 && i != j){
     41                 return 0;
     42             }
     43         }
     44     }
     45     return 1;
     46 }
     47 
     48 struct node{
     49     int deg;
     50     char ch;
     51 };
     52 bool cmp(node a, node b)
     53 {
     54     return a.deg > b.deg;
     55 }
     56 
     57 void print()
     58 {
     59     //int deg[30];
     60     //memset(deg, 0, sizeof(deg));
     61     node character[30];
     62     for(int i = 0; i < n; i++){
     63         character[i].deg = 0;
     64         character[i].ch = 'A' + i;
     65     }
     66     for(int i = 0; i < n; i++){
     67         for(int j = 0; j < n; j++){
     68             if(tmpg[i][j]){
     69                 character[i].deg++;
     70             }
     71         }
     72     }
     73     sort(character, character + n, cmp);
     74     for(int i = 0; i < n; i++){
     75         printf("%c", character[i].ch);
     76     }
     77     printf(".
    ");
     78 
     79     /*queue<int>que;
     80     for(int i = 0; i < n; i++){
     81         printf("%d
    ", deg[i]);
     82         if(!deg[i]){
     83             que.push(i);
     84             break;
     85         }
     86     }
     87     for(int i = 0; i < n; i++){
     88         int x = que.front();que.pop();
     89         printf("%c", x + 'A');
     90         for(int k = 0; k < n; k++){
     91             if(tmpg[k][x])deg[k]--;
     92             if(!deg[k])que.push(k);
     93         }
     94     }*/
     95 }
     96 
     97 int main()
     98 {
     99     while(scanf("%d%d", &n, &m) != EOF && n || m){
    100         memset(g, 0, sizeof(g));
    101         /*for(int i = 0; i < n; i++){
    102             g[i][i] = 1;
    103         }*/
    104 
    105         int i;
    106         bool dont = false;
    107         for(i = 1; i <= m; i++){
    108             char a, b;
    109             getchar();
    110             scanf("%c<%c", &a, &b);
    111             g[a - 'A'][b - 'A'] = 1;
    112             if(!dont){
    113                  int flag = floyd();
    114                 if(flag == -1){
    115                     printf("Inconsistency found after %d relations.
    ", i);
    116                     dont = true;
    117                 }
    118                 else if(flag == 1){
    119                     printf("Sorted sequence determined after %d relations: ", i);
    120                     print();
    121                     dont = true;
    122                 }
    123             }
    124         }
    125         if(i > m && !dont){
    126             printf("Sorted sequence cannot be determined.
    ");
    127         }
    128     }
    129     return 0;
    130 }
  • 相关阅读:
    Python在程序中进行多任务操作-协程
    Python-异常处理
    Python多任务-协程
    【每日一具4】TikTok 抖音国际版(网站)使用起来非常简单,无需FQ随便看
    【每日一具3】优美APP一款好用的短视频软件,优美APP专注于各种小姐姐短视频
    Python在程序中进行多任务操作-线程
    Python在程序中进行多任务操作-进程
    Python多任务-线程
    Python多任务-进程
    【每日一具3】优美APP一款好用的短视频软件,优美APP专注于各种小姐姐短视频
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9972039.html
Copyright © 2011-2022 走看看