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; 如果所有点都有这个关系,那么唯一的关系就确定了,接下来拓扑排序就能找出这个关系.
相关文章推荐
- POJ-1094 Sorting It All Out
- poj 1094 Sorting It All Out
- 拓扑序列变形 之 poj 1094 Sorting It All Out
- [POJ] 1094 Sorting It All Out
- POJ1094 Sorting It All Out
- Sorting it ALL Out(POJ_1094)
- poj1094——Sorting It All Out
- POJ-1094 Sorting It All Out
- Hoj 1336/Poj 1094 Sorting It All Out
- POJ 1094 Sorting It All Out
- POJ 1094 Sorting It All Out
- 初学拓扑排序---POJ1094(Sorting It All Out)
- Sorting It All Out(POJ--1094
- Poj 1094 Sorting It All Out (传递闭包+拓扑排序)
- 【改了一天的拓扑排序】POJ 1094——Sorting It All Out
- POJ1094——Sorting It All Out
- POJ 1094 Sorting It All Out
- POJ1094 Sorting It All Out
- ZOJ 1060 Sorting It All Out(POJ 1094)(关系闭包+计数排序)
- poj 1094 Sorting It All Out(java + 拓扑排序)