受此文启发:
http://www.cnblogs.com/pushing-my-way/archive/2012/08/23/2652033.html
用链式表实现拓扑排序,我这里用的是栈,当然队列也是可以的。
#include<iostream> #include<cstring> #include<stack> using namespace std; int rudu[27],map[27][27],list[27]; int toposort(int n) { bool flag; int i,j,rudu1[27],temp1; stack<int>s1; memcpy(rudu1,rudu,sizeof(rudu1)); for(i=1;i<=n;i++) if(rudu1[i]==0) s1.push(i); i=0; flag=0; while(s1.size()!=0) { if(s1.size()>1) flag=1; temp1=s1.top(); s1.pop(); list[++i]=temp1; for(j=1;j<=n;j++) if(map[temp1][j]==1&&--rudu1[j]==0) s1.push(j); } if(i<n) return 1;//有环,无法形成n个元素的拓扑排序 else if(flag==1) return 2;//没有环,但入度为0的点不唯一,当前没有形成拓扑排序,但可以形成n个元素的拓扑排序 return 3;//已经形成n个元素的拓扑排序 } int main() { bool flag; char data[100]; int i,n,m,ans,j; while(scanf("%d%d",&n,&m)&&(n!=0||m!=0)) { flag=1; memset(rudu,0,sizeof(rudu)); memset(map,0,sizeof(map)); for(i=1;i<=m;i++) { scanf("%s",data); if(flag) { if(map[data[0]-64][data[2]-64]==0) { map[data[0]-64][data[2]-64]=1; rudu[data[2]-64]++; } ans=toposort(n); if(ans==1) { flag=0; printf("Inconsistency found after %d relations.\n",i); } else if(ans==3) { flag=0; printf("Sorted sequence determined after %d relations: ",i); for(j=1;j<=n;j++) printf("%c",list[j]+64); printf(".\n"); } } } if(flag) printf("Sorted sequence cannot be determined.\n"); } }
时间: 2024-10-10 05:43:07