题目:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/501856684d71b3cd473354a7c1e95e09.png)
分析:
1.有无环,决定是否矛盾。
2.无环条件下,有深度(所以bfs)为点个数的路径,则关系确定。
3.若所有数据读完,没1,2,则无法判断。
真的要每加入一个点就进行一次判断吗?
嗯,我还是太菜,其实用一个拓扑排序就能解决前两种了。
环,拓扑排序中找不到没有入度为0的点了。
判断思路:
拓扑第一步,加入入度为0的点:统计q的大小,为0,则就是有环了。
其实这个题的难点是那两种情况想到用拓扑排序就可以直接处理。
终于写出来了:
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > vv;
vector<int> cnt(26,0);
vector<int> cnt2(26,0);
int done[26];
int done2[26];
vector<int> v;
int m,n;
int ii;
int f()
{
queue<int> q;
int num=0;
for(int i=0;i<26;i++)
{
if(cnt[i]==0&&done[i])
{
q.push(i);
done2[i]=1;
int num2=q.size();
num=max(num,num2);
}
}
if(num==0) return -1;
while(!q.empty())
{
int c=q.front();
q.pop();
for(int i=0;i<vv[c].size();i++)
{
cnt[vv[c][i]]--;
if(cnt[vv[c][i]]==0)
{
q.push(vv[c][i]);
done2[vv[c][i]]=1;
int num2=q.size();
num=max(num,num2);
}
}
}
return num;
}
int main()
{
cin>>m>>n;
memset(done,0,sizeof(done));
for(int i=0;i<26;i++)
{
vv.push_back(v);
}
string ss;
cin>>ss;
vv[ss[0]-'A'].push_back(ss[2]-'A');
cnt[ss[2]-'A']++;
done[ss[0]-'A']=1;done[ss[2]-'A']=1;
for(ii=2;ii<=n;ii++)
{
cin>>ss;
vv[ss[0]-'A'].push_back(ss[2]-'A');
cnt[ss[2]-'A']++;
done[ss[0]-'A']=1;done[ss[2]-'A']=1;
memset(done2,0,sizeof(done2));
cnt2=cnt;
int ccc=f();
cnt=cnt2;
if(ccc==-1)
{
cout<<"Inconsistency found after "<<ii<<" relations.";
return 0;
}
int all=0;
for(int i=0;i<26;i++)
{
if(done[i]) all++;
if(done[i]!=done2[i])
{
cout<<"Inconsistency found after "<<ii<<" relations.";
return 0;
}
}
if(ccc!=1)
{
continue;
}
if(all==m)
{
cout<<"Sorted sequence determined after "<<ii<<" relations: 123";
return 0;
}
}
cout<<"Sorted sequence cannot be determined.";
}
找到去欸的那个关系还要输出,其实就是再来一遍拓扑排序。就是进入队列的顺序,不想写了。用123表示了。