您的位置:首页 > 其它

poj 1094 Sorting It All Out

2012-04-01 11:13 459 查看
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
#define N_MAX 27

bool map[N_MAX][N_MAX];
int indegree[N_MAX];
int outdegree[N_MAX];
int n,m;
char str[N_MAX];
bool floyd()
{
for(int k=0;k<n;++k)
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(map[i][k]&&map[k][j]) map[i][j]=true;
//根据map[t][t]判断是否有环出现
for(int t=0;t<n;++t)
if(map[t][t]) return false;
return true;

}

bool IsDetermined()
{
//根据每个点的出度和入度之和是否是n-1
int i,j;
memset(indegree,0,sizeof(indegree));
memset(outdegree,0,sizeof(outdegree));
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
if(map[i][j]) {++indegree[j],++outdegree[i];}
}

//判断
for(i=0;i<n;++i)
if(indegree[i]+outdegree[i]!=n-1) return false;
return true;
}

void topologicalSort()
{
int i,j=0;
stack<int> st;
memset(str,0,sizeof(str));
//首先找到第一个入度为零的节点
//bool mark[N_MAX]={false};
for(i=0;i<n;i++)
if(indegree[i]==0)  st.push(i);
//mark[i]=true;
while(!st.empty())
{
int t=st.top();
str[j++]=t+'A';
st.pop();
for(i=0;i<n;++i)
if(map[t][i]==true && !(--indegree[i]))//&& mark[i]==false)
st.push(i);
}
str[j]='\0';
}
int main()
{
char buf[5];
int Inconsistency,Determined;

//freopen("a.txt","r",stdin);
while(cin>>n>>m,n||m)
{
Inconsistency=Determined=0;
memset(map,false,sizeof(map));
for(int i=1;i<=m;++i)
{
//输入信息,
cin>>buf;
map[buf[0]-'A'][buf[2]-'A']=true;
//用floyd算法,计算闭包,判断是否存在环
if(Inconsistency || Determined) continue;
else if(!floyd())
{//当出现环时
Inconsistency=i;
}
else if(IsDetermined())
{//当顺序确定时
//用拓扑排序输出线性序列
topologicalSort();
Determined=i;
}
}
if(Inconsistency) printf("Inconsistency found after %d relations.\n",Inconsistency);
else if(Determined) printf("Sorted sequence determined after %d relations: %s.\n",Determined,str);
else printf("Sorted sequence cannot be determined.\n");
}
return 0;
}


题目信息:http://poj.org/problem?id=1094

方法:

拓扑排序 每次读入一对关后,做一次floyd, 计算传递闭包. 然后判环,其实很简单,就是看有没有点i的map[i][i]=1; 有就证明有环!如果有环就矛盾了。 如果无环再判断是否能确定关系,(注意每次都把出入度数组清零!)计算每个点的出度+入度是否=n-1; 如果所有点都有这个关系,那么唯一的关系就确定了,接下来拓扑排序就能找出这个关系.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: