题意: 还是字母比大小 然后判断是否有回路,在第几个信息之后可以确定拓扑次序 或者否定拓扑次序的存在
这题的题目是错的 因为在确定了一个拓扑序之后还可能出现破坏信息
但是如果这样判断 那么代码就会写错
因此我们只能将错就错 在确定拓扑序列之后 跳出或者忽略之后的信息就可以拿到Ac--呵呵呵呵呵
#include<queue>
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxn 111
char op[111];
int head[maxn],cnt,vis[maxn],in[maxn],tmp[maxn],id[maxn],tmpvis[maxn];
struct edge{
int u,v,next;
}e[maxn*10];
void init(){
memset(head,-1,sizeof head);
memset(vis,0,sizeof vis);
memset(id,-1,sizeof id);
memset(in,0,sizeof in);
cnt=0;
}
void add(int u,int v){
e[cnt].u=u;e[cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0)break;
init();
int fl=0,fl1=0;
priority_queue<int>q;
for(int i=0;i<m;++i){
scanf("%s",op);
if(fl||fl1)continue;
add(op[0]-'A',op[2]-'A');
vis[op[0]-'A']=vis[op[2]-'A']=1;
in[op[2]-'A']++;
for(int j=0;j<26;++j)tmp[j]=in[j];
for(int j=0;j<26;++j)
if(vis[j]&&in[j]==0){
q.push(j);
}
for(int i=0;i<26;++i)tmpvis[i]=vis[i];
while(!q.empty()){
int cur=q.top();q.pop();
for(int j=head[cur];j!=-1;j=e[j].next){
int v=e[j].v;
tmp[v]--;
tmpvis[v]=max(tmpvis[v],tmpvis[cur]+1);
if(tmp[v]==0)q.push(v);
}
}
for(int j=0;j<26;++j){
if(tmp[j]!=0)
fl=i+1;
}
if(!fl&&!fl1){
for(int i=0;i<26;++i)
if(tmpvis[i])
id[tmpvis[i]]=i;
int all=0;
for(int i=1;i<=n;++i){
if(id[i]==-1){all=1;break;}
}
if(all){memset(id,-1,sizeof id);}
else fl1=i+1;
}
}
if(fl)printf("Inconsistency found after %d relations.\n",fl);
else if(!fl1)printf("Sorted sequence cannot be determined.\n");
else{
printf("Sorted sequence determined after %d relations: ",fl1);
for(int i=1;i<=n;++i)printf("%c",'A'+id[i]);
printf(".\n");
}
}
return 0;
}