Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 14966 | Accepted: 5062 |
Description
Input
Output
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sample Input
4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.
解体思路: 拓扑排序,参考了鸵鸟的解体。第一次做topsort,还有些生疏
topsort()
{
for all nodes in graph:
find zero indrgee nodes;
if nodes=0:
loop occurs;
else nodes>2
ambigous nodes
else
normal;
extract nodes from graph;
extract related edges of nodes, and re-calculate indegree.
}
#include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; /* return "AB..." done "ambigous" "inconsistency" */ string topSort(bool map[26][26], int indegree[26], int n) { int indegreeCpy[26]; int zeroIndegreeNodes; string rlt; bool ambigous; int zeroNodes; //init for(int i=0; i<n; i++) indegreeCpy[i]=indegree[i]; rlt=""; ambigous=false; //sort for(int i=1; i<=n; i++) { //find zero indegree nodes zeroIndegreeNodes=0; for(int j=0; j<n; j++) { if(indegreeCpy[j]==0) { zeroIndegreeNodes++; zeroNodes=j; } } if(zeroIndegreeNodes==0) { rlt="inconsistency"; return rlt; //loop occurs } else if(zeroIndegreeNodes>1) { ambigous=true; } //extract zeroNodes indegreeCpy[zeroNodes]=-1; for(int j=0; j<n; j++) { if(map[zeroNodes][j]) { indegreeCpy[j]--; } } rlt+=string(1,char(zeroNodes+'A')); } if(ambigous) rlt="ambigous"; return rlt; } int main() { int n,m; bool map[26][26]; int indegree[26]; string rlt; int step; char ch1,ch2,chSign; while(scanf("%d%d",&n,&m)!=EOF && n!=0 && m!=0) { //init memset(map,0,sizeof(map)); memset(indegree,0,sizeof(indegree)); step=1; rlt=""; //solve for(int i=1; i<=m; i++) { getchar(); scanf("%c%c%c",&ch1,&chSign,&ch2); map[ch1-'A'][ch2-'A']=true; indegree[ch2-'A']++; if(rlt=="" || rlt=="ambigous") { rlt=topSort(map,indegree,n); step=i; } } //rlt if(rlt=="inconsistency") cout << "Inconsistency found after "<<step<<" relations.\n"; else if(rlt=="ambigous") cout << "Sorted sequence cannot be determined.\n"; else cout << "Sorted sequence determined after "<<step<<" relations: "<<rlt<<".\n"; } return 0; }