如果给你许多人的高低关系,让你为这些人按从高到低排个序,你会怎么做?
我们会用拓扑排序来完成,把每个关系组成图用箭头表示,先把入度为0的点放到队列中,在根据队列把列内元素指向的元素入度减1,之后再寻找入度为0的元素放入队列,这样子得到的元素总数cnt如果与事先知道的元素总数n相等则说明无环出现,如果不等则说明这个问题有环且无解:
ZCMU-2153
#include<queue>
#include<iostream>
#include<cstdio>
#include<string.h>
#include<vector>
#include<cstring>
#include<cctype>
#include<cmath>
#include<set>
#include<algorithm>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=50;
vector<int>edges[maxn];
int A[1000005],cnt=0;
priority_queue<int,vector<int>,greater<int> >q;
int deg[maxn];
set<int>k;
int main()
{
char s[5];
while(cin>>s)
{
k.insert(s[2]-'A');
k.insert(s[0]-'A');
if(s[1]=='>')
{
edges[s[0]-'A'].push_back(s[2]-'A');
deg[s[2]-'A']++;
}
else
{
edges[s[2]-'A'].push_back(s[0]-'A');
deg[s[0]-'A']++;
}
}
for(int i=0;i<30;i++)
{
if(k.count(i)!=0&°[i]==0)q.push(i);
}
while(!q.empty())
{
int t=q.top();
q.pop();
A[cnt++]=t;
for(int i=0;i<edges[t].size();i++)
{
int to=edges[t][i];
deg[to]--;
if(deg[to]==0&&k.count(to)!=0)q.push(to);
}
}
if(cnt==k.size())
{
for(int i=0;i<cnt;i++)printf("%c",A[i]+'A');
printf("\n");
}
else puts("No Answer!");
return 0;
}