首页 > 其他分享 >POJ - 1094 Sorting It All Out

POJ - 1094 Sorting It All Out

时间:2023-01-12 19:11:54浏览次数:94  
标签:1094 std Sorting const int 30 顺序 POJ include

POJ - 1094 Sorting It All Out

题解:Floyd传递闭包

A<B
A<C
B<C
C<D
B<D
A<B

首先他给你这些关系,比如说:A<B,B<C我们很容易就能推出啊A<C,显然满足传递性,所以我们利用传递闭包求解,题目表示如果中途发现顺序混乱或者中途发现顺序确定,就可以不用管后面的输入了,但是如果从头到尾既没有发现顺序颠倒,也没有确定序列顺序,那么序列就是不能确定的。

1.所以我们需要对每次的输入都去进行传递闭包,观察有无顺序颠倒,我们来看一下什么叫做顺序颠倒

	A B C D
A	0 1 0 0
B   1 0 1 0
C	1 0 0 0
D   1 0 0 0 

很显然我们发现\(A<B并且B<A\),这说明:只要出现\(f[u][v] ==f[v][u]=1\)就能说明顺序有问题

2.那么什么样的情况顺序就确定了

​ A B C D

A 0 1 0 0
B 1 0 1 0
C 1 0 0 1
D 1 0 0 0

这样的情况实际上已经确定了,即\((f[u][v]==1 || f[v][u]==1)并且 f[u][v]!=f[v][u]\),如果所有的u和v在经过传递闭包后都满足此条件。说明顺序确定

3.顺序确定后如何输出序列

我们发现入度越大的节点他的位置就越靠后,所以我们根据\(f[u][v]\)矩阵中的v代表列,那么列中的1代表du[v]的入度,我们按照入度升序即可,最后按照顺序输出

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 1e5 + 10;
int n, m;
int f[30][30];
int ff[30][30];
int du[30];
vector<pii> ans;
int floyd()
{
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            ff[i][j] = f[i][j];
    for (int k = 1; k <= n; ++k)
        for (int u = 1; u <= n; ++u)
            for (int v = 1; v <= n; ++v)
            {
                if (u == v)
                    continue;
                ff[u][v] |= ff[u][k] & ff[k][v];
            }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (i == j)
                continue;
            if (ff[i][j] && ff[j][i])
                return -1; // 代表出现顺序异常
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (i == j)
                continue;
            if (!ff[i][j] && !ff[j][i])
                return 0; // 代表还找不到顺序
        }
    }
    return 1; // 代表已经找到顺序了
}
int main(void)
{
    Zeoy;
    int t = 1;
    while (t--)
    {
        while (cin >> n >> m)
        {
            if (n == 0 && m == 0)
                break;
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                    f[i][j] = 0, ff[i][j] = 0, du[i] = 0;
            ans.clear();
            int isprint = 0;
            for (int i = 1; i <= m; ++i)
            {
                string s;
                cin >> s;
                s = " " + s;
                int x = s[1] - 'A' + 1, y = s[3] - 'A' + 1;
                f[x][y] = 1;
                int ret = floyd();
                // cout << "ret=" << ret << endl;
                if (!isprint)
                {
                    if (ret == -1)
                    {
                        cout << "Inconsistency found after " << i << " relations." << endl;
                        isprint = 1;
                    }
                    else if (ret == 1)
                    {
                        cout << "Sorted sequence determined after " << i << " relations: ";
                        for (int u = 1; u <= n; ++u)
                            for (int v = 1; v <= n; ++v)
                                if (ff[u][v])
                                    du[v]++;
                        for (int i = 1; i <= n; ++i)
                            ans.push_back(make_pair(du[i], i));
                        sort(all(ans));
                        for (int i = 0; i < ans.size(); ++i)
                            cout << char(ans[i].second + 'A' - 1);
                        cout << ".\n";
                        isprint = 1;
                    }
                }
            }
            if (!isprint)
                cout << "Sorted sequence cannot be determined." << endl;
        }
    }
    return 0;
}

标签:1094,std,Sorting,const,int,30,顺序,POJ,include
From: https://www.cnblogs.com/Zeoy-kkk/p/17047694.html

相关文章

  • POJ - 1797 Heavy Transportation
    POJ-1797HeavyTransportation题解:Dij最短路变形题意:让你求从起点1到起点n的每条路径权重最小值的最大值,显然可以二分答案,但是我们这边考虑利用dij求解。首先来一......
  • CF1768E Partial Sorting
    可能更好的阅读体验题目传送门题目翻译题目解析显然我们可以证明\(f(p)\in\{0,1,2,3\}\)\(f(p)=0\)显然只有\(s_1=1\)种。考虑\(f(p)=1\)如果前面交换一次,那么......
  • POJ - 3687 Labeling Balls
    POJ-3687LabelingBalls题解:反向建边+拓扑排序先来简单讲一下题意:我们把重量1-N的小球贴上标签,题目给出的输出a->b,就代表贴着标签a的小球必须比贴着标签b的小球轻,最......
  • POJ - 1321 棋盘问题
    POJ-1321棋盘问题题解:DFS搜索#include<bits/stdc++.h>#defineZeoystd::ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0)#defineall(x)(x).b......
  • CF1768E Partial Sorting - 组合数学 -
    题目链接:https://codeforces.com/contest/1768/problem/E题解:记P1为将\(1..2\timesn\)排序,P2为将\(n+1..3\timesn\)排序首先观察到答案一定不会超过3(P1P2......
  • SPOJ SP32058 R6PL - Harbinger vs Sciencepal
    链接难度:\(\texttt{17/21}\)\(T\)组数据。有\(n\)组,每组有\(2\)个数\(x,y\),问把每组的一个数分配到一组另一个数分配到另一组两组数字和差的绝对值最小是多少。......
  • POJ - 1182 食物链
    POJ-1182食物链题解:种族并查集引理:对于普通的并查集,我们总是用来查找和维护每个元素之间的同类关系,而种族并查集总是用来解决一些存在对立关系,而且对象的关系存在传......
  • SPOJ SP34020 ADAPET - Ada and Pet
    链接难度:\(\texttt{13/19}\)\(T\)组数据。你需要构造一个字符串满足其中包含\(k\)个给定的字符串\(s\),输出该字符串的最短长度。数据范围:\(k\le10^6,\sum|s|\l......
  • Java中的POJO与JavaBean / Java Bean与POJO的区别与联系
    POJO(PlainOrdinaryJavaObject)即普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO。有一些private的参数作为对象的属性,然后针对每一个参数定义get和set......
  • spring boot——spring boot的基本配置——spring boot整合mybatis——本地实例运行—
    POJO类:packageorg.example.entity;publicclassMyUser{privateintid;privateStringname;privateintage;publicintgetId(){......