poj 1094 Sorting It All Out(图论)
http://poj.org/problem?id=1094
这一题,看了个大牛的解题报告,思路变得非常的清晰:
1,先利用floyd_warshall算法求出图的传递闭包
2,再判断是不是存在唯一的拓扑排序,利用出度和入度是不是相加为n-1
3,利用拓扑排序求出当前的图形的唯一的拓扑排序
一开始我的思路跟上述的差不多,但是没有利用floyd_warshall算法求出传递闭包,准备着利用拓扑排序求出是不是存在着有环回路,我觉得我的这个思路也是可以的。等一下我会将我的这个思路给写成程序。在我的百度云中有这个程序的测试数据(来自poj)
http://pan.baidu.com/disk/home#dir/path=%2Facm%2F%E5%8C%97%E5%A4%A7acm%2F1094
#include <iostream>
//#include <fstream>
using namespace std;
#define MAX 30
/*396K 16MS*/
//var
int a[MAX][MAX];
int n;
int flag1,flag2; //falg1代表的是当前有环的错误,即存在错误的排序
char s[MAX]; //存放最后的结果
//fstream fin;
//function
bool transition();
bool judge();
void toposort(); //main函数
int main()
{
//fin.open("1094.txt",ios::in);
int m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
memset(a,0,sizeof(a));
int count=1;
flag1=flag2=false;
for(int i=0;i<m;i++)
{
char b1,b2;
cin>>b1>>b2>>b2;
if(flag1||flag2) continue;
if(a[b1-'A'][b2-'A']==0)
{
a[b1-'A'][b2-'A']=1;
//求传递闭包,判断是不是有环,这样就知道是不是存在着错误的答案
if(!transition()){flag1=true;continue;}
//判断是不是存在着唯一的拓扑排序
else if(judge())
{
toposort();
flag2=true;
continue;
}
}
++count;
} if(flag1)
cout<<"Inconsistency found after "<<count<<" relations."<<endl;
else if(flag2)
cout<<"Sorted sequence determined after "<<count<<" relations: "<<s<<"."<<endl;
else
cout<<"Sorted sequence cannot be determined."<<endl;
}
system("pause");
return 0;
} //求传递闭包
bool transition()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]==1||a[i][k]==1&&a[k][j]==1)
a[i][j]=1; for(int i=0;i<n;i++)
if(a[i][i]==1)
return false;
return true;
} //计算是不是存在着唯一的拓扑排序
bool judge()
{
int *ind=new int[n];
int *outd=new int[n];
memset(ind,0,sizeof(int)*n);
memset(outd,0,sizeof(int)*n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j])
{
ind[j]++;
outd[i]++;
}
}
} for(int i=0;i<n;i++)
if(ind[i]+outd[i]<n-1)
return false;
return true;
} //拓扑排序的实现
void toposort()
{
//按照入度来进行计算
int *ind=new int[n];
memset(ind,0,sizeof(int)*n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(a[i][j]==1)
ind[j]++;
} //求出入度后计算出当前的的拓扑排序的结果
int t=n;
for(int i=0;i<n;i++)
{
int j;
for(j=0;j<n;j++)
if(ind[j]==0)
{ ind[j]--; s[i]=j+'A'; break;}
int t=j;
for(j=0;j<n;j++)
if(a[t][j]==1)
ind[j]--;
} s[n]='\0';
}
poj 1094 Sorting It All Out(图论)的更多相关文章
- 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 解题报告
题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具 ...
- POJ 1094 Sorting It All Out 拓扑排序 难度:0
http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...
- POJ 1094 Sorting It All Out【拓扑排序】
题目链接: http://poj.org/problem?id=1094 题意: 给定前n个字母的大小关系,问你是否 根据前xxx个关系得到上升序列 所有关系都无法确定唯一的一个序列 第xxx个关系导 ...
- poj.1094.Sorting It All Out(topo)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28762 Accepted: 99 ...
- poj 1094 Sorting It All Out(nyoj 349)
点击打开链接 Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24544 Accep ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- nyoj 349&Poj 1094 Sorting It All Out——————【拓扑应用】
Sorting It All Out 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 An ascending sorted sequence of distinct ...
随机推荐
- Android设置全屏
全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLA ...
- sql server 2008 (3)
数据库表常用术语 关系--即二维表.每个关系都有个关系名,就是表名 域:取值范围 记录--行 字段,属性--列 关联--指哪个数据库表之间的数据彼此联系的方式 关键字:属性或属性的组合,可以唯一标识一 ...
- 动态规划-Burst Balloons
Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it ...
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)
本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...
- 翻书的效果:FMX.TSwipeTransitionEffect Animation
This example shows how to use a TSwipeTransitionEffect transition and a TPathAnimation to simulate t ...
- 关于IE的兼容模式
前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入了文件兼容性.在IE6中引入一个增设的兼容性模式,文件兼容性使你能够在IE呈现你的网页时选择特定编译模式. 新的IE为了确保网页 ...
- ASP.NET设置焦点到输入框
Page.SetFocus(txtLoginName);
- jQuery源码笔记——回调对象
回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表. 最简单的缓存对象 function Callbacks(){ var list = [], self = { add: fu ...
- 获取UIButton的一些属性
获取文字 button.currentTitle 更多如下: @property(nullable, nonatomic,readonly,strong) NSString *currentTitl ...
- C#扩展方法的理解 (转)
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...