排序
题目链接:https://www.luogu.com.cn/problem/P1347
题意:
对于n个变量A,B,C..
给定m个类似A<B的关系,判断满足这些变量之间什么关系
1.是否出现逻辑矛盾,(A<B,B<C,C<A)
2.是否能够判断出所有变量之间的大小关系
思路:
拓补排序问题
对于每一个A<B关系,我们建立一个由A指向B的有向边
那么逻辑矛盾等价于出现环
无法判断所有变量关系的情况有:1.关系模糊(A<B,A<C,B<D,C<D:B与C等价)2.有变量还没有给出关系
int n,m;
vector<int>e[maxn];
vector<int>tp;
int din[26];
int din_cy[26];
int md=1;
set<int>st;
int toposort(){
queue<int>q;
for(int i=0;i<n;i++)if(din[i]==0&&st.count(i)){
q.push(i);
tp.pb(i);
}
for(int i=0;i<n;i++)din_cy[i]=din[i];
int flag=1;
while(q.size()){
if(q.size()>=2)flag=0;//没法判断
int now=q.front();q.pop();
for(int i=0;i<e[now].size();i++){
int v=e[now][i];din_cy[v]--;
if(din_cy[v]==0){
q.push(v);
tp.pb(v);
}
}
}
for(int i=0;i<n;i++){
if(st.count(i)&&din_cy[i]){
md=0;return -1;//环
}
}
if(!flag)return 0;
if(tp.size()==n){
return 1;//可以
}else return 0;//没法判断
}
void solve(){
cin>>n>>m;
int ok=1;
for(int k=1;k<=m;k++){
string s;cin>>s;
int u=s[0]-'A';
int v=s[2]-'A';
e[u].pb(v);
din[v]++;
st.insert(u);st.insert(v);
tp.clear();
int res=toposort();
if(res==-1){
cout<<"Inconsistency found after "<<k<<" relations.";return;
}else if(res==1){
cout<<"Sorted sequence determined after "<<k<<" relations: ";
for(int j=0;j<tp.size();j++){
cout<<(char)(tp[j]+'A');
}
cout<<'.';return;
}
}
cout<<"Sorted sequence cannot be determined."<<endl;
}