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(图论)的更多相关文章

  1. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

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

    http://poj.org/problem?id=1094 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. poj 1094 Sorting It All Out 解题报告

    题目链接:http://poj.org/problem?id=1094 题目意思:给出 n 个待排序的字母 和 m 种关系,问需要读到第 几 行可以确定这些字母的排列顺序或者有矛盾的地方,又或者虽然具 ...

  4. POJ 1094 Sorting It All Out 拓扑排序 难度:0

    http://poj.org/problem?id=1094 #include <cstdio> #include <cstring> #include <vector& ...

  5. POJ 1094 Sorting It All Out【拓扑排序】

    题目链接: http://poj.org/problem?id=1094 题意: 给定前n个字母的大小关系,问你是否 根据前xxx个关系得到上升序列 所有关系都无法确定唯一的一个序列 第xxx个关系导 ...

  6. poj.1094.Sorting It All Out(topo)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28762   Accepted: 99 ...

  7. poj 1094 Sorting It All Out(nyoj 349)

    点击打开链接 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24544   Accep ...

  8. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  9. nyoj 349&Poj 1094 Sorting It All Out——————【拓扑应用】

    Sorting It All Out 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 An ascending sorted sequence of distinct ...

随机推荐

  1. 【自学php】第四天 - 使用数组

    php支持两种数组,数字索引数组和关联数组.关联数组有点类似Map,可以用字符串或其他数据类型做键对应相应的值保存在数组中. 1.初始化数组 数字索引数组的初始化可以使用如下代码: $products ...

  2. Topo软件

    http://jung.sourceforge.net/#! http://www.netdisco.org/ http://sourceforge.net/projects/toponet/ htt ...

  3. setTimeout()与setInterval() 问题

    提示:setTimeout() 只执行 code 一次.如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout(). 1. setInterval(c ...

  4. 探究android控件及布局

    控件(widget) 1. TextView(该控件的一些需要注意的属性,下同) gravity="center"textSize="24sp"textColo ...

  5. VS2010中xercesc配置及简单示例

    从官网下载xerces-c-3.1.1并解压,打开工程项目 xerces-c-3.1.1\projects\Win32\VC10\xerces-all\xerces-all.sln, 选择Xerces ...

  6. PHP自学2——将用户提交表单存储到外部普通文件中

    在上一节中我们已经实现了将用户的订单信息提交到服务器端,然后服务器端将提交信息返回并显示到页面上.这一节将把上一节用户的订单信息保存到外部的普通文件中(即.txt文本文件中). 本节代码将用户提交的订 ...

  7. 共享器 TS ERROR WINDOWS-FAILED 错误解决方法

    问题:TS  ERROR WINDOWS-FAILED 原因:微软操作系统自动更新补丁(KB956572)与终端机软件有冲突. 解决方法: .打开“开始菜单”: .打开“控制面板”: .打开“添加/删 ...

  8. C++中引用用于结构

    正确 void change(test &target) { target.name = "aaa"; } 错误 void change(const test &t ...

  9. 浅谈C中的指针和数组(六)

    数组和指针,原本不想在写了,觉得这部分差不多了,但是自己在写程序的时候还是发现了一个错误.首先说一下我的要求: 给一个函数传递一个二维数组,然后我想在这个函数里面计算这个数组的行数. 写个类似的错误D ...

  10. ecshop开发日志之手机端虚拟商品自动发货

    在ecshop官方模版收,web端的虚拟商品购买后不能像pc端那般直接在付款后出现虚拟商品的卡号,密码,截止日期一下为让手机购买也可以在付款后自动显示发货并能显示卡号密码截止日期首 先找到pc端的fl ...