poj1094Sorting It All Out 拓扑排序
2024-08-31 05:39:27
做拓扑排序的题目,首先要知道两条定理:
1、最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列。 (有圈)
2、如果一次入队的入度为零的点数大于1,则拓扑序列不唯一。 (关系不确定)
本题有一个默认的东西,如果到了第K(看K<m)步,能唯一确定一个序列,就不用管之后会不会产生矛盾。
这题的思路还是比较清晰的。输入也只有X<Y(只有<符号,并且X,Y都只是大写字母),数据量比较小。不过边数没有限制,用链式前向星的话不太好,还是用邻接矩阵吧。每次用邻接矩阵要注意的是判断重边,做小生成树的时候是用初始化边为无穷大,然后每次取小的。但是这里没有边权,所以只要有边,赋值为1,就可以了。遇到重边的话,不能再加入度。
只需要拓扑排序就可以解决这个问题了。我就犯了画蛇添足的错误,我居然用floyd去判圈。这主要是对拓扑排序理解不够的原因。当出现的字母的数字小于n时,没出现的字母的入度是零,所以不影响拓扑排序产生的数据元素的个数。只有有圈的情况才会使得数组元素个数小于n。
还有,我犯了一个很二的错误。因为没输入一组数据就要做一次拓扑排序。我居然把统计入度的数组没有变化就用了。囧了。再声明一个数组,每次拓扑排序之前,把入度数组的数据复制过来就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int N = ;
int ind[N],que[N], g[N][N],id[N];
int iq,flag, T;
void topo(int n)
{
int i,k,j=,x;
T=;
for(i=;i<=n;i++)
{
id[i]=ind[i];
if(id[i]==) que[j++]=i;
}
if(j>) T=;
x=j;
for(i=;i<j;i++)
{
if(j-x>) T=;
x=j;
int u=que[i];
for(k=;k<=n;k++)
{
if(g[u][k]&&u!=k)
{
id[k]--;
if(id[k]==) que[j++]=k;
}
}
}
iq=j;
}
void init()
{
flag=;
memset(ind,,sizeof(ind));
memset(g,,sizeof(g));
}
int main()
{
//freopen("test.txt","r",stdin);
int n,m,i,j,k,t,a,b;
char ch1,ch2,ch;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n) break;
init();
t=;
for(k=;k<=m;k++)
{
do
scanf("%c",&ch1);
while (!isalpha(ch1)) ;
scanf("<%c",&ch2);
if(flag) continue;
a=ch1-,b=ch2-;
if(a>n||b>n||a==b) flag=;
if(flag) {printf("Inconsistency found after %d relations.\n",k);continue;}
if(g[a][b]) continue;
g[a][b]=;
ind[b]++;
topo(n);
if(iq<n){flag=;printf("Inconsistency found after %d relations.\n",k);continue;}
if(iq==n&&!T){
flag=;
printf("Sorted sequence determined after %d relations: ",k);
for(i=;i<n;i++) printf("%c",que[i]+);
printf(".\n");
continue;
}
if(k==m&&!flag) printf("Sorted sequence cannot be determined.\n");
}
}
return ;
}
最新文章
- [资料分享]ACCESS2013 零基础到精通
- 监控阮一峰老师的blog
- 每日学习笔记:js中可以直接用id名调用的问题?
- Windows 64位 RabbitMQ 安装配置
- 6、SQL Server 数据查询
- 用";时:分:秒";的方式显示运行时间
- Ubuntu下eclipse开发hadoop应用程序环境配置
- org.apache.hadoop.ipc.RemoteException(java.io.IOException)
- 2 NFS高可用解决方案之NFS的搭建
- [Spring] IOC - Annotation
- VB中WinSock控件的属性、方法、事件及应用
- 从Wep page到Application
- 2016 版 Laravel 系列入门教程(五)【最适合中国人的 Laravel 教程】
- JS 学习笔记--11---内置对象(Global/Math)
- unity3D中协程和线程混合
- poj 1149 PIGS【最大流经典建图】
- Windows下用Caffe跑自己的数据(遥感影像)
- asp.net SignalR 一对一聊天
- 使用vue-cli构建多页面应用+vux(一)
- AGC010 - D: Decrementing
热门文章
- day008 字符编码之 字符编码 、Python2和Python3字符编码的区别
- H3C交换机配置学习随笔
- Windows server 2008R2系统登录密码破解
- PHP stream_socket_server
- Google Shell Style Guide
- 数据挖掘系列 (1) 关联规则挖掘基本概念与 Aprior 算法
- [luogu 1092] 虫食算 (暴力搜索剪枝)
- 使用pm2启动nodejs+express+mysql管理系统步骤
- phpcms 电脑手机合并
- Jquery语法基础