题意:给出m对关于n个字母的小于关系,输出通过这些关系能得到的结论,如果可以排序就输出至少知道第几个关系时就可以知道顺序,从小到大输出顺序;如果产生歧义就输出在第几个关系时出现歧义,如果不能得出准确的大小关系就输出无法排序。

解法:拓扑排序。拓扑排序的大致流程就是先找入度为0的点,然后删去跟这个点相邻的边,再继续找入度为0的点,如果能一直找下去直到删掉所有边,则说明拓扑有序,否则拓扑无序。对于这道题,1.如果每次找到的入度为0的点有且只有一个且拓扑有序,则说明已有确定的顺序;2.如果找不到入度为0的点且还没删掉所有边则说明有环,即产生歧义;3.如果出现某一次找到的入度为0的点超过1个且拓扑有序,则说明还没有确定的顺序。

综合以上几点和网上的一些题解,有如下结论:

1.在拓扑排序的时候必须遍历整个图才可以得出结论,不可以发现入度为0的点超过1时就认为无法排序,还可能是产生歧义,此处注意上述第三条加粗部分。

2.题目中貌似(可能是我没看见)没说如果歧义出现在可以排序之后算歧义还是可以排序,我现在可以确定是算可以排序。

就这些了吧……貌似

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int n, m;
string sorted;
int indegree[30];
vector <int> edge[30];
int topoSort()
{
int degree[30];
memcpy(degree, indegree, sizeof degree);
stack <int> s;
for(int i = 0; i < n; i++)
if(degree[i] == 0) s.push(i);
int res = 1;
int cnt = 0;
sorted.clear();
while(!s.empty())
{
cnt++;
if(s.size() > 1) res = 0;
int tmp = s.top();
sorted += ('A' + tmp);
s.pop();
for(int i = 0; i < edge[tmp].size(); i++)
{
if(--degree[edge[tmp][i]] == 0) s.push(edge[tmp][i]);
}
}
if(cnt == n)
return res;
else return -1;
}
int main()
{
while(~scanf("%d%d", &n, &m) && !(n == 0 && m == 0))
{
memset(indegree, 0, sizeof indegree);
for(int i = 0; i < 26; i++) edge[i].clear();
int ans = 0, pos = m;
for(int i = 0; i < m; i++)
{
char input[5];
scanf("%s", input);
if(!ans)
{
edge[input[0] - 'A'].push_back(input[2] - 'A');
indegree[input[2] - 'A']++;
ans = topoSort();
}
else pos = min(i, pos);
}
if(ans == 1)
cout << "Sorted sequence determined after " << pos << " relations: " << sorted << "." << endl;
else if(ans == -1)
cout << "Inconsistency found after " << pos << " relations." << endl;
else
cout << "Sorted sequence cannot be determined." << endl;
}
return 0;
}

  

POJ 1094 Sorting It All Out的更多相关文章

  1. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

  2. poj 1094 Sorting It All Out (拓扑排序)

    http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  4. poj 1094 Sorting It All Out(图论)

    http://poj.org/problem?id=1094 这一题,看了个大牛的解题报告,思路变得非常的清晰: 1,先利用floyd_warshall算法求出图的传递闭包 2,再判断是不是存在唯一的 ...

  5. poj 1094 Sorting It All Out 解题报告

    题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具 ...

  6. POJ 1094 Sorting It All Out【拓扑排序】

    题目链接: http://poj.org/problem?id=1094 题意: 给定前n个字母的大小关系,问你是否 根据前xxx个关系得到上升序列 所有关系都无法确定唯一的一个序列 第xxx个关系导 ...

  7. poj.1094.Sorting It All Out(topo)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28762   Accepted: 99 ...

  8. poj 1094 Sorting It All Out(nyoj 349)

    点击打开链接 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24544   Accep ...

  9. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  10. nyoj 349&Poj 1094 Sorting It All Out——————【拓扑应用】

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...

随机推荐

  1. 谁会是 Zabbix 和 Nagios 的继任者?

    [编者按]本文根据 Dataloop.IO 的创始人兼 CEO David Gildeh 对监控工具市场的现状分析以及对未来发展趋势的展望,展开拓展讨论. 为什么监控还是一塌糊涂? 为了调研市场,从而 ...

  2. 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

    这书适合我. 哈哈,结合 以前的知识点,勉强能看懂. 讲得细,还可以参照着弄出来. 希望能坚持 完成啦... 原来,JSTL就类似于DJANGO中的模板. 而servlet类中的res,req,玩了D ...

  3. JMeterPluginCMD命令行工具使用详解

    MeterPluginCMD命令行工具生成png图片和csv统计文件 Jmeter是个纯java的开源的轻量级性能测试工具,功能强大.因为是轻量级的,与loadrunner相比,报告统计的相对较少.不 ...

  4. [hackerrank]Even Odd Query

    https://www.hackerrank.com/contests/w5/challenges 简单题,注意整数的0次方是1,奇数. #include <iostream> #incl ...

  5. Git教程之创建版本库(2)

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  6. C++:类的成员函数定义方式

    1.成员函数的第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数的定义 放在类的外部. 返回值类型 类名::成员函数名(参数表) {      函数体  } class Point{ pub ...

  7. MFC编程入门

    一. 什么是MFC? 如果你要建立一个Windows应用程序,应该如何下手? 好的开端是从设计用户界面开始. 首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象.Windows用 ...

  8. Android开发之assets文件夹中资源的获取

    assets中的文件都是保持原始的文件格式,需要使用AssetManager以字节流的形式读取出来 步骤: 1. 先在Activity里面调用getAssets() 来获取AssetManager引用 ...

  9. mysql定时计划任务,ON COMPLETION [NOT] PRESERVE 当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而声明PRESERVE的作用是使事件在执行完毕后不会被Drop掉

    当为on completion preserve 的时候,当event到期了,event会被disable,但是该event还是会存在当为on completion not preserve的时候,当 ...

  10. bzoj3632

    裸的最大团,随机化大法好 多次随机出一个选择顺序然后贪心即可 ..,..] of boolean; a:..] of longint; v:..] of boolean; n,m,i,j,x,y,an ...