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个字母,均为大写. 想法:显然,很容 ...
随机推荐
- LINUX 使用DBCA创建ORACLE数据库
- 简单好用的General开发框架
1.开篇概述 从2004年学习编程,2007年学习C#以来,做的多半都是跟数据库打交道的工作,所以也积累了很多数据库方面的知识,用过一些ORM框架,从了解掌握到自己实现,慢慢积累了很多代码,直到201 ...
- ASCII\UNICODE编码的区别
前几天,Google给我Hotmail邮箱发了封确认信.我看不懂,不是因为我英文不行,而是"???? ????? ??? ????"的内容让我不知所措.有好多程序员处理不好编码问题 ...
- Luogu 1445 樱花
BZOJ 2721 唔,太菜了弄不来. 先通分:得到 $\frac{x + y}{xy} = \frac{1}{n!}$ 两边乘一下 $(x + y)n! - xy = 0$ 两边加上$(n!)^2$ ...
- Entity Framework Tutorial Basics(29):Stored Procedure in Entity Framework
Stored Procedure in Entity Framework: Entity Framework has the ability to automatically build native ...
- 深、浅copy
深.浅copy多用于列表 浅copy:第一层中不变的数据是独立的,可变类型元素指向同一块内存地址 l1 = [1,2,3,["a","b"]] l2 = l1. ...
- 《Spring实战》-1
1.Spring的主要特性:依赖注入DI和面向切面编程AOP. 2.关键策略: 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码:切面和模板 3.Spri ...
- 【Android开源】CircleImageView自定义圆形控件的使用
github地址:https://github.com/hdodenhof/CircleImageView package de.hdodenhof.circleimageview; import e ...
- leetcode mergeKsortedlink
代码:这个代码是有问题的,问题的产生是map中不能存放相同的值. #include<iostream> #include<vector> #include<cmath&g ...
- EXTJs前后台交互 常用哦3种方式
<1>Ajax交互方式 Ext.Ajax.request( { //被用来向服务器发起请求默认的url url : "", //请求时发送后台的参数,既可以是Json对 ...