POJ1094 Sorting It All Out

来源:互联网 发布:波兰 知乎 编辑:程序博客网 时间:2024/06/06 19:09

拓扑排序题,每加入一条边,判断

(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;}

第一次写紧缩风格的代码,总觉得好丑= =

原创粉丝点击