https://vjudge.net/problem/POJ-1094

题意

对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序。

分析

拓扑排序模板题。唯一麻烦点的是判断在第几个式子就可以确定关系。由于在题目中,每个元素的关系都是严格定义的,那么当队列中存在不止一个入度为0的顶点时,可以认为未能成功排序,即还需要更多条件。当拓扑排序算法进行完后,拓扑序列的个数不够,则认为排序出现了矛盾。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
template <class T>
inline bool scan_d(T &ret){char c;int sgn;if(c=getchar(),c==EOF) return 0;while(c!='-'&&(c<'0'||c>'9')) c=getchar();sgn=(c=='-')?-1:1;ret=(c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');ret*=sgn;return 1;
}
//const int N = 1e6+10;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1000000000;
int T;
void testcase(){printf("Case %d:",++T);
}
const int MAXN = 2500 ;
const int MAXM = 110;
const double eps = 1e-8;
const double PI = acos(-1.0);bool g[30][30];
int topu[30];
int indeg[900];
int n,m;
int topuSort(){queue<int>q;int cnt=0;int in[900];memcpy(in,indeg,sizeof(indeg));for(int i=0;i<n;i++){if(in[i]==0){q.push(i);}}int u;bool zeros = false;while(!q.empty()){if(q.size()>1) zeros=true;u=q.front();q.pop();topu[cnt++]=u;for(int i=0;i<n;i++){if(g[u][i]){in[i]--;if(in[i]==0) q.push(i);}}}if(cnt!=n) return -1;if(zeros) return 0;return 1;
}
int main() {
#ifdef LOCALfreopen("data.in","r",stdin);
#endif // LOCALwhile(~scanf("%d%d ",&n,&m)&&n){char temp[10];mset(g,false);mset(indeg,0);int pos;bool f1 = false;bool f2 = false;for(int i=0;i<m;i++){scanf("%s",temp);if(f1||f2) continue;int u = temp[0]-'A';int v = temp[2]-'A';if(!g[u][v]){g[u][v]=true;indeg[v]++;}int flag = topuSort();if(flag==-1){f1=true;pos=i+1;}else if(flag==1){pos=i+1;f2=true;}}if(f1){printf("Inconsistency found after %d relations.\n",pos);}else if(f2){printf("Sorted sequence determined after %d relations: ",pos);for(int i=0;i<n;i++) printf("%c",'A'+topu[i]);puts(".");}else{printf("Sorted sequence cannot be determined.\n");}}return 0;
}

转载于:https://www.cnblogs.com/fht-litost/p/9244271.html

POJ - 1094 Sorting It All Out(拓扑排序)相关推荐

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

    题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系.   由DAG图节点的偏序关系确定节点的排序可以由拓扑排序求出.而 ...

  2. POJ - 1094 Sorting It All Out(拓扑排序+floyd传递闭包)

    题目链接:点击查看 题目大意:给出N个点以及M个比较关系,问在第几个数字可以确定出唯一的序列,或者判断出矛盾的序列,或者最后也无法确定出一个唯一的序列 题目分析:关于这个题目可以直接分类讨论,可以直接 ...

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

    2018-3-25 拓扑排序的题目,需要注意的是,这里是边输入边判断的,之前有一组数据一直不知道为什么不过: A>F B>D C>E F>D D>E E>F 其实当 ...

  4. nyoj349 poj1094 Sorting It All Out(拓扑排序)

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349 poj1094   http://poj.org/problem?id=1 ...

  5. Sorting It All Out 拓扑排序+确定点

    这一道题的话  数据有一点问题    ........     例如 不过 还是   能理解一下  试试吧  ......... 3 5 A<B B<C C<A A<C B&l ...

  6. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  7. POJ 1094 拓扑排序

    题意大坑,建议先看Discuss-- 否则代码写得就像以下的一团糟.... 其实并不难,拓扑排序+乱搞就可以AC. // by SiriusRen #include <cstdio> #i ...

  8. 图论之拓扑排序 poj 2367 Genealogical tree

    题目链接 http://poj.org/problem?id=2367 题意就是给定一系列关系,按这些关系拓扑排序. #include<cstdio> #include<cstrin ...

  9. [POJ] 3687 Labeling Balls(拓扑排序)

    题目地址:http://poj.org/problem?id=3687 反向建边,即重的球指向轻的球,注意重边,然后拓扑排序.从n-->1循环,即每次从入度为0的球里面选编号大的存(包含输入的逻 ...

最新文章

  1. [ZT]SQL Server 的事务日志意外增大或充满的处理方法
  2. 制作新版STC单片机WiFi下载器
  3. C++控制台没有引用的头文件也会编译的原因
  4. Vim编辑器的基本使用和三种模式
  5. jsp springmvc 视图解析器_Springmvc中多视图解析器解析问题
  6. VTK:Points之RadiusOutlierRemoval
  7. 郑州升达经贸管理学院计算机科学与技术,郑州升达经贸管理学院计算机科学与技术专业2016年在福建理科高考录取最低分数线...
  8. FreeRTOS信号量---二值信号量
  9. cocos2d 走动椭圆
  10. 互联网热门职位薪酬报告
  11. 作者:​张群(1988-),女,博士,中国电子技术标准化研究院设备与数据研究室副主任。...
  12. 不允许创建临时变量交换两个变量的内容
  13. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
  14. K-means均值聚类算法的原理与实现
  15. linux基础--awk文本分析工具详解
  16. linux 基础命令汇总
  17. java编写的爬虫demo_我用Java写的第一个爬虫Demo-爬图片
  18. YonMaster开发者认证线上赋能培训班定档4月18日
  19. android 设置音效EQ
  20. IPv4地址的结构体与网络字节序

热门文章

  1. PHP垃圾回收机制防止内存溢出
  2. struts2文件下载出现Can not find a java.io.InputStream with the name的错误
  3. iOS开发日记1-tableview编辑
  4. [转载]每个极客都应该知道的Linux技巧
  5. (转)我的座驾见谁灭谁!
  6. 网卡故障:弹出界面eth0: 错误:没有找到合适的设备:没有找到可用于链接System eth0 的
  7. TP5 实现链接分享/帮助,限制每个用户每天一次帮忙
  8. PowerShell-5.网络请求
  9. POJ 1679 判断最小树是否唯一
  10. 【C 语言】内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )