nyoj349 poj1094 Sorting It All Out(拓扑排序)
nyoj349 http://acm.nyist.net/JudgeOnline/problem.php?pid=349
poj1094 http://poj.org/problem?id=1094
这两个题是一样的,不过在poj上A了才算真的过,ny上数据有一点弱。
题目大意输入n,m。 一共有n个字母(从A开始), m行语句每个语句“x﹤y”,说明x,y之间的偏序关系。让你判断是否可以通过这些关系得到一个唯一的升序序列,若能则输出这个序列并指出通过前多少条语句得出的,如果n个字母间存在矛盾,输出相应语句并指出那条语句开始出现矛盾的。如果没有唯一序列又不存在矛盾就输出想应信息。
分析:
所用算法拓扑排序:使有向图G的每一条边(u,v)对应的u都排在v的前面。不难发现如果图中存在又向环,则不存在拓扑排序。拓扑排序答案可能有多个(例如:a﹤b; c﹤b; d﹤c; 排序可为adcb或dacb),但此题中要求排序唯一。
首先我们可以把每组小于关系看成是一个又向边,这样我们还会得到一个又向图,我们所要做的就是把图中所有点排序,因为需要知道在哪出现矛盾,在哪可以得到唯一排序的,那么我们就每输入一个边(小于关系)就更新一次图,做一回拓扑排序,看是否能得到唯一排序、有矛盾。如果所有边都结束了还没有矛盾,那就看看排序是否唯一。
在排序的时候我们需要记录每个点u所排的位置(小的排在前面),已知的由u为出发点的边可能有多个(也就是已给出多个“u﹤xi”的偏序关系),那么u点所拍的位置就是所有xi中的最小值-1。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
//v[i]标记第i个字母是否dfs过, sum[i]存储排在第i位的字母有几个(用来判断排序是否唯一)
int n, m, v[], a[], sum[], k[];
vector<int> vec[];
struct egde
{
int x, y;
}e[];
int dfs(int x)
{
int flag = ;
v[x] = -;//正在搜索的点标记为-1
int mi = n+;
for(int i = ; i < vec[x].size(); i++)
{
flag = ;
int y = vec[x][i];
if(v[y] < ) return ;
else if(v[y] == )
{
if(dfs(y) == )
return ;
else
mi = min(mi, a[y]);
}
mi = min(mi, a[y]);
}
v[x] = ;//搜索过的点标记为1
//a[x]记录字母x排在第几位
if(flag == )//flag=1说明有已知比他大的点, x就排在 所有比它大的点的最小位置 的前面
a[x] = mi - ;
else a[x] = n;//flag= 0,说明x是已知最大的点之一,排在最后一位n位
return ;
}
int topu()
{
memset(v, , sizeof(v));
for(int i = ; i <= n; i++) a[i] = n+;//初始化所有点的排序位置为n+2;
for(int i = ; i <= n; i++)
{
if(v[i] == && vec[i].size() != )
{
int tem = dfs(i);
if(tem == ) return ;
}
}
return ;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF && n && m)
{
for(int i = ; i <= m; i++)
{
char a, b, c;
int tem;
cin >> a >> c >> b;
tem = a - 'A' + ; e[i].x = tem;//e[i]存储第i条边的两个点
tem = b - 'A' + ; e[i].y = tem;
}
int error = -;
int flag;//标记排序是否为为一
for(int i = ; i <= n; i++) {vec[i].clear();}
for(int i = ; i <= m; i++)
{
flag = ;
vec[e[i].x].push_back(e[i].y);//不断加入边, 每次加边都跟新存出边的vec;
error = topu();//每次加边都进行一次拓扑排序, 返回值=0时,存在矛盾, 返回值=1时没有矛盾
if(error == )//error = 0, 则有矛盾
{
printf("Inconsistency found after %d relations.\n", i);
break;
}
else if(error == )
{
memset(sum, , sizeof(sum));
flag = ;
for(int i = ; i <= n; i++)
{
if(a[i] == n + )//当字母i排在第n+2位时,说明字母i没由与它连接的边,
{
flag = ;continue;
}
sum[a[i]]++;//sum[i]存储排在第i位的字母有几个(用来判断排序是否唯一)
k[a[i]] = i;//k[i]记录排在第i位的字母
if(sum[a[i]] > ){flag = ; break;}//如果排在同一位置的字母不止一个,则有矛盾
}
if(flag == )//若所有点都有与之连接的边,并且字母所拍的位置不重复则说明排序唯一
{
printf("Sorted sequence determined after %d relations: ", i);
for(int i = ; i <= n; i++)
printf("%c", k[i] + 'A' - );
printf(".\n");
break;
}
}
}
if(flag == )//若不存在矛盾, 但是字母的所排位置有重复,则说明排序不唯一
printf("Sorted sequence cannot be determined.\n");
}
return ;
}
nyoj349 poj1094 Sorting It All Out(拓扑排序)的更多相关文章
- [poj1094]Sorting It All Out_拓扑排序
Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...
- POJ1094 Sorting It All Out —— 拓扑排序
题目链接:http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Tot ...
- ACM: poj 1094 Sorting It All Out - 拓扑排序
poj 1094 Sorting It All Out Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & ...
- poj 1094 Sorting It All Out (拓扑排序)
http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断
题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上 ...
- POJ1094 Sorting It All Out LUOGU 排序
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40012 Accepted ...
- POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29984 Accepted: 10 ...
- [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
- POJ 1094 Sorting It All Out (拓扑排序) - from lanshui_Yang
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
随机推荐
- [转]ASP.NET MVC 入门2、项目的目录结构与核心的DLL
我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...
- SQL Server查询性能优化——堆表、碎片与索引(一)
SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找 一遍.如果有可采用的索引,SQL Server只需要在索引层级查 ...
- Effect-Compiler Tool(fxc.exe)
提前编译shader文件,提高运行时的效率. refer to http://msdn.microsoft.com/en-us/library/windows/desktop/bb509710%28v ...
- 关于npoi不能导入07以上版本的Excel
因为在npoi版本中1.几之下的版本的不能导入07版本以上的excel是因为在其中的封装的方法中不支持, 所以很简单我们去网站上下一新的版本的npoi就是了,最好是新出来的2.1.1版本的就完全zhi ...
- 以后坚持用java
1.不要贪多,现在专心学习java.读一些jvm的书. 2.研究lucene,hadoop.mahout,和日后用的自然语言分析lingpipe. 3.对于数据挖掘方向,专注与weka的学习,同时注意 ...
- HW3.2
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- java动态编程库,利用动态编程打印运行时调用全景(函数调用关系链)
如果是一般java程序,不追求性能极致,想使用方便,推荐使用 Javassist 库. 如果是android程序,或者一般java程序欲追求性能极限,推荐使用 asm for java 及 asmde ...
- Redis 数据库结构设计
Redis设计参考资料: http://my.oschina.net/fsmwhx/blog/152130 http://my.oschina.net/1123581321/blog/164288 h ...
- [四]SpringMvc学习-对servlet与json的支持与实现
1.对servletAPI的支持 request.response.session作为参数自动注入 2.对Json的支持 2.1springmvc配置文件中添加支持对象与json的转换 <mvc ...
- [html]js打开指定页面
1.在当前窗口打开 location.href = "http://www.baidu.com"; 2.可以设置开发方式 window.open("http://www. ...