POJ1094Sorting it all out

Posted magicduck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1094Sorting it all out相关的知识,希望对你有一定的参考价值。

题目链接:https://www.acwing.com/problem/content/345/

题目大意:给定 (m) 个不等式关系 , 确定变量间的大小关系 , 或找出不等式关系间的矛盾

solution

如果(i < j) , (j < k) , 则 (i < k) ,因此这些不等式关系间具有传递性 , 所以这是一道经典的传递闭包问题 ,可以用(Floyd) 传递关系

(g[i][j] = 1) 表示 (i < j) , (g[i][j] = 0) 表示 (i geq j) 或不确定 , 其中(g[i][j]) |= (g[i][k]) & (g[k][j]) , 最后依次遍历 , 如果 (g[i][j] = 1)(g[j][i] = 1) , 则发生矛盾 , 如果 (g[i][j] = 0)(g[j][i] = 0) , 则无法确定 , 否则 , 可以确定 (i)(j) 之间的唯一关系 , 输出时每次找到最小的输出并排除即可

时间复杂度: (O(mn^2))

code

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &FF) {
    int RR = 1; FF = 0; char CH = getchar();
    for(; !isdigit(CH); CH = getchar()) if(CH == '-') RR = -RR;
    for(; isdigit(CH); CH = getchar()) FF = FF * 10 + CH - 48;
    FF *= RR;
}
inline void file(string str) {
    freopen((str + ".in").c_str(), "r", stdin);
    freopen((str + ".out").c_str(), "w", stdout);
}
const int N = 1e3 + 10;
char ai, bi, ci;
int pd[N][2], g[30][30], n, m;
int check(int xi) {
    memset(g, 0, sizeof(g));
    for(int i = 1; i <= xi; i++)
        g[pd[i][0]][pd[i][1]] = true;
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                g[i][j] |= g[i][k] & g[k][j];
    int flag = 0;
    for(int i = 1; i <= n; i++) 
        for(int j = 1; j <= n; j++)
            if(i != j) {
                if(g[i][j] && g[j][i]) return false;
                else if(!g[i][j] && !g[j][i]) flag = true;
            } 
            else if(g[i][j] == 1) return false;
    return flag + 1;
}
void print(int xi) {
    printf("Sorted sequence determined after %d relations: ", xi);
    int out[30] = {0};
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++)
            if(!out[j]) {
                int flag = 0;
                for(int k = 1; k <= n; k++)
                    if(!out[k] && g[k][j]) {
                        flag = 1;
                        break;
                    }
                if(!flag) {
                    cout << char(j + 'A' - 1), out[j] = 1;
                    break;
                }
            }
    }
    cout << "." << endl;
}
int main() {
    //file("");
    while(true) {
        read(n), read(m);
        if(!n && !m) break;
        for(int i = 1; i <= m; i++) {
            cin >> ai >> bi >> ci;
            if(bi == '<') pd[i][0] = ai - 'A' + 1, pd[i][1] = ci - 'A' + 1; 
            else pd[i][1] = ai - 'A' + 1, pd[i][0] = ci - 'A' + 1;
        }
        int fg = 0;
        for(int i = 1; i <= m; i++)
            if(!check(i)) {
                printf("Inconsistency found after %d relations.
", i);
                fg = 1; break;
            }
            else if(check(i) == 1) {
                print(i);fg = 1; break;
            }
        if(fg)  continue;
        puts("Sorted sequence cannot be determined.");
    }
    return 0;
}

以上是关于POJ1094Sorting it all out的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1094: Sorting It All Out( 拓扑排序 )

POJ 1094 Sorting It All Out(拓扑排序判环)

POJ1094 Sorting It All Out

POJ 1094 Sorting It All Out

POJ 1094 Sorting It All Out

POJ1094Sorting it all out