poj1094 拓扑排序(出度入度简单使用)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 37764 | Accepted: 13327 |
Description
Input
Output
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sample Input
4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.
题目链接:点击打开链接
题目大意:给你一堆A<B这样的顺序,进行拓扑,判断到第几次满足条件了就输出,不需要管后面的东西。要么顺序确定,要么顺序冲突,要么结尾了还不确定。
题目思路:首先理解两个概念,入度和出度,入度就是插入这个点的边的数量(指向这个点),出度就是这个点出去的边的数量。对于一个确定了顺序的序列,每一个节点的出度入度之和肯定为n-1,(自己想一下),那这道题就每次输入边的时候对出度入度进行操作就可以了,具体看代码,比较详细。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
#include<cmath>
#include<time.h>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<algorithm>
#include<numeric>
using namespace std;
typedef long long ll;
const int maxn=30;
int g[maxn][maxn];
char s[10];
struct peo{
int in,ou;// 存放每一个节点的出度和入度
char id;
}aa[40];
bool cmp(peo a,peo b){
return a.ou>b.ou;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m),n&&m){
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++){
aa[i].in=0;
aa[i].ou=0;
aa[i].id='A'+i-1;
}
int to,flag=1;//flag为1 表示还没有输出过
for(to=1;to<=m;to++){
scanf("%s",s);
if(!flag)continue;
int a=s[0]-'A'+1,b=s[2]-'A'+1;//将字符转化为数字 更简单
if(g[b][a]||a==b){//如果存在环 或者输入的是A<A
printf("Inconsistency found after %d relations.\n",to);
flag=0;
}
if(g[a][b])continue;//如果关系已经存在 就不用再操作
g[a][b]=1;//建立关系
aa[a].ou++;//节点出度入度操作
aa[b].in++;
for(int i=1;i<=n;i++){
if(g[i][a]){// 存在i-a 肯定存在 a-b i出度++ b入度++
if(g[i][b])continue;//如果已经存在关系 说明之前操作过了 continue
g[i][b]=1;
aa[i].ou++;
aa[b].in++;
}
if(g[b][i]){// 与上同理
if(g[a][i])continue;
g[a][i]=1;
aa[i].in++;
aa[a].ou++;
}
}
int f=1;
for(int i=1;i<=n;i++){
if(aa[i].in+aa[i].ou!=n-1){//每一个节点 出度入度之和为n-1 即整个序列关系确定
f=0;
break;
}
}
if(f){
flag=0;
sort(aa+1,aa+1+n,cmp);//按照出度进行排序
printf("Sorted sequence determined after %d relations: ",to);
for(int i=1;i<=n;i++){
printf("%c",aa[i].id);
}
printf(".\n");
}
}
if(flag)printf("Sorted sequence cannot be determined.\n");//如果flag还是1 说明之前没有输出 顺序不确定
}
}
poj1094 拓扑排序(出度入度简单使用)的更多相关文章
- POJ1094 拓扑排序
问题:POJ1094 本题考查拓扑排序算法 拓扑排序: 1)找到入度为0的点,加入已排序列表末尾: 2)删除该点,更新入度数组. 循环1)2)直到 1. 所有点都被删除,则找到一个拓扑 ...
- POJ1094——拓扑排序和它的唯一性
比较模板的topological-sort题,关键在于每个元素都严格存在唯一的大小关系,而一般的拓扑排序只给出一个可能解,这就需要每趟排序的过程中监视它是不是总坚持一条唯一的路径. 算法导论里面的拓扑 ...
- poj1094拓扑排序
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29539 Accepted: 10 ...
- PAT A1146 Topological Order (25 分)——拓扑排序,入度
This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topol ...
- hdoj1285 拓扑排序
题目链接 分析: 很明显,一看就是拓扑排序. 看似简单, 暗藏武器啊. 第一次做的时候一边拓扑排序一边标记他们的深度, 例如题中给的例子 {1 2:2 3:4 3 }.1的深度为1. 2.4的深度为2 ...
- 使用 C# 代码实现拓扑排序
0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. https://www.codeproject.com/Articles/869059/Topological-sorti ...
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- 牛客网NOIP赛前集训营-提高组(第六场)-A-最长路[拓扑排序+hash+倍增]
题意 给定一个 \(n\) 点 \(m\) 边的边权非负的有向图,边有字符,求以每个点为开头的最长路字典序最小的路径 \(hash\) 值. \(n,m\leq 10^6\) 分析 首先建反图拓扑排序 ...
- [poj1094]Sorting It All Out_拓扑排序
Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...
随机推荐
- mysql in 方法查询 按照 in队列里的顺序排序
String sql ' GROUP BY comm " + "order by field(comm,?,?,?,?,?,?,?,?)"; stmt = conn.pr ...
- if __name__ == "__main__": 的使用
#!/usr/bin/env python from qq.lib.a2 import register from qq.lib.a3 import login def main(): while T ...
- re.I re.L re.M re.S re.U re.X
- saltstact的安装与配置
Saltstack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,人们一般习惯把saltstack比作成简化版的puppet和加强版的func.saltstack基于Pytho ...
- oracle -sqlplus 调用存储过程
sp.batsqlplus user/passwd/sid @.\sp.sql >sp.sqlexit; sp.sqlexex xxxx()quit;
- android-auto-scroll-view-pager (无限广告轮播图)
github 地址: https://github.com/Trinea/android-auto-scroll-view-pager Gradle: compile ('cn.trinea.andr ...
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
题意:题目中定义了一种运算,把数字x变成数字x的二进制位数.问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算 ...
- CF 1027E Inverse Coloring
当天晚上并没有看懂题意,然后就刚了40分钟F,但是没有弄出来呜呜呜. 推荐博客: https://blog.csdn.net/Dream_maker_yk/article/details/81840 ...
- PersonDto中@ResourceAccess(readOnly = true)以及swagger的理解-----似懂非懂,日后消化
@JsonApiResource(type = PersonDto.RESOURCE_TYPE) @EntityMapping(entityClass = Person.class) //@Resou ...
- jemalloc和内存管里
netty的buffer引入了缓冲池.该缓冲池实现使用了jemalloc的思想.为了看懂这块代码学写了内容分配的知识.这里讲的内存分配是堆的内存分配,其他内容本文不会涉及. 内存分配是面向虚拟内存的而 ...