1.链接地址
https://vjudge.net/problem/POJ-1094#author=TIMEpings
2.问题描述
用小于号"<"来定义两元素之间的关系,并于一个没有重复元素的有序上升序列 从小到大地排列这些元素。
比如说,序列A,B,C,D意味着A<B;B<C;C<D。
在这个问题里,我们会给你一组形如"A<B"的关系,询问你有序序列的合法性或其本身。
输入样例
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
输出样例
Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.
3.解题思路
这道题我觉得难在题意理解。。。
题目就是拓扑排序,但是需要记录是在第几步就可以排出序了,还有第几步开始矛盾,或者压根排不了序
4.算法实现源代码
/**/ #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <cctype> #include <queue> #include <stack> #include <cmath> #include <map> #include <set> #define mm(i,v) memset(i,v,sizeof i); using namespace std; typedef long long ll; typedef unsigned long long ull; const ll INF=99999999999999; const int inf=999999999; const int maxn=26+5; vector<int> e[maxn]; int n,m; int in[maxn],temp[maxn]; int u,v; queue<int> q; char a[4],c[maxn]; int ans,cnt; int Toposort() { while(!q.empty()) q.pop(); for(int i=0;i<n;i++) if(!in[i]) q.push(i); bool unsure=false; cnt=0; while(!q.empty()) { if(q.size()>1) unsure=true; int qq=q.front(); c[cnt++]=qq+'A'; q.pop(); for(int i=0;i<e[qq].size();i++) { in[e[qq][i]]--; if(in[e[qq][i]]==0) q.push(e[qq][i]); } } if(cnt<n) return 2; if(unsure) return 3; return 1; } bool check(int x,int y) { for(int i=0;i<e[x].size();i++) if(e[x][i]==y) return true; return false; } int main() { while(scanf("%d%d", &n, &m) != EOF && (m || n)) { bool f=false; int step,flag; for(int i=0;i<maxn;i++) e[i].clear(); mm(in,0); for(int i=1;i<=m;i++) { scanf("%s",a); if(f) continue; u=a[0]-'A'; v=a[2]-'A'; if(!check(u,v)) { e[u].push_back(v); in[v]++; } memcpy(temp,in,sizeof in); flag=Toposort(); memcpy(in,temp,sizeof temp); if(flag!=3) { f=true; step=i; } } if (flag == 1) { c[cnt] = '\0'; printf("Sorted sequence determined after %d relations: %s.\n", step, c); } else if (flag == 2) printf("Inconsistency found after %d relations.\n", step); else printf("Sorted sequence cannot be determined.\n"); } return 0; }