真的惨,弄了一下午。。
晚上终于过了
要先判断有序和有环的状态
一直纠结的点终于搞明白了
我一直纠结有很多点但一开始有一条边怎么处理,看了别人写的,这样是能跑满的,但不确定
无序的情况我下午就想明白了,如果一次入的顶点大于2,肯定就是无序的;
如果长度小于n,就有环;
总结一下知识点:
有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
通常,一个有向无环图可以有一个或多个拓扑排序序列。
这就是区别;
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
vector<int> e[27];
int in[27];
int flag=1;
string s;
int topusort(int n)
{
int ret=1;
int temp[27];
for(int i=1;i<=n;i++)
temp[i]=in[i];
queue<int> q;
s.clear();
for(int i=1;i<=n;i++)
if(in[i]==0) q.push(i);
if(q.size()>1) ret=0;
while(!q.empty()){
int now=q.front(); q.pop();
s+=(now+'A'-1);
int num=0;
for(int i=0;i<e[now].size();i++){
int t=e[now][i];
temp[t]--;
if(temp[t]==0) {
num++; q.push(t);
}
}
if(num>=2) ret=0;
}
if(s.size()<n) return -1;
return ret;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
char temp[3];
for(int i=1;i<=n;i++)
e[i].clear();
int flag=0,p;
memset(in,0,sizeof(in));
for(int i=0;i<m;i++){
scanf("%s",temp);
if(flag!=0) continue;
int x=temp[0]-'A'+1;
int y=temp[2]-'A'+1;
e[x].push_back(y);
in[y]++;
flag=topusort(n);
p=i;
}
if(flag==1) {
printf("Sorted sequence determined after %d relations: ",p+1);
s+='.'; cout<<s<<endl;
}
if(flag==-1) {
printf("Inconsistency found after %d relations.\n",p+1);
}
if(!flag) {
printf("Sorted sequence cannot be determined.\n");
}
}
}