拓扑排序题,每加入一条边,判断
(1)形成有向环,退出
(2)形成唯一拓扑顺序,退出
(3)加入所有边后,仍无法确定唯一拓扑顺序
注意判断的优先级!!!
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n,m,nn,ans,flag;
int g[30][30],d[30];
bool vis[30],qt;
char str[5],order[30];
int topo(){
int td[30],k=0,no=0;
for (int i=0;i<n;i++) td[i]=d[i];
queue<int> Q;
for (int i=0;i<n;i++)
if (td[i]==0) Q.push(i);
while (!Q.empty()){
if (Q.size()!=1) no=1;
int u=Q.front(); Q.pop();
order[k++]=u+'A';
for (int v=0;v<n;v++){
if (u==v) continue;
if (g[u][v]){
td[v]--;
if (td[v]==0) Q.push(v);
}
}
}
if (k<nn) return -1;
if (no||k<n) return 0;
order[k]='\0';
return 1;
}
int main(){
while (scanf("%d%d",&n,&m)==2 && (n||m)){
memset(g,0,sizeof(g));
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
nn=0; qt=0;
for (ans=1;ans<=m;ans++){
scanf("%s",str);
if (qt) continue;
if (!vis[str[0]-'A']) {vis[str[0]-'A']=1; nn++;}
if (!vis[str[2]-'A']) {vis[str[2]-'A']=1; nn++;}
if (g[str[0]-'A'][str[2]-'A']==0){g[str[0]-'A'][str[2]-'A']=1; d[str[2]-'A']++;}
flag=topo();
if (flag==1) {printf("Sorted sequence determined after %d relations: %s.\n",ans,order); qt=1;}
if (flag==-1) {printf("Inconsistency found after %d relations.\n",ans); qt=1;}
}
if (qt==0) puts("Sorted sequence cannot be determined.");
}
return 0;
}
第一次写紧缩风格的代码,总觉得好丑= =