首页 > 代码库 > poj 1094 Sorting It All Out (拓扑排序)
poj 1094 Sorting It All Out (拓扑排序)
链接:poj 1094
题意:给定一系列关系(只存在大写字母),判断是否存在矛盾,
或无法确定关系,或可以确定唯一的关系
分析:利用拓扑排序,但是需要边输入关系边排序
矛盾:判断是否存在环
确定关系:能找出唯一的拓扑排序
不能确定关系:不存在环,且所有关系处理后,关系仍无法确定
注:如果出现矛盾,则无需判断接下来的关系了
#include<stdio.h> #include<string.h> int n,m,vis[30],rd[30],flag[30],map[30][30],cnt; char t[30]; int tpsort() { int i,j,k,num,mark=1; cnt=0; memset(vis,0,sizeof(vis)); //标记是否访问 for(i=0;i<n;i++) if(flag[i]){ num=0; for(j=0;j<n;j++) //计算入度为0的个数 if(flag[j]&&!rd[j]&&!vis[j]) num++; if(num==0) //若不存在入度为0结点,则存在环 return 0; if(num>1) //若入度为0的结点大于1,说明无法确立唯一的拓扑关系 mark=0; for(j=0;j<n;j++){ if(flag[j]&&!rd[j]&&!vis[j]){ t[cnt++]=j+'A'; vis[j]=1; break; } } for(k=0;k<n;k++) if(map[j][k]) rd[k]--; } if(!mark) cnt=0; return 1; } int main() { int i,j,mark,pos,r[30]; char s[5]; while(scanf("%d%d",&n,&m)!=EOF){ if(m==0&&n==0) break; mark=1; memset(map,0,sizeof(map)); memset(flag,0,sizeof(flag)); //标记该元素是否存在 memset(r,0,sizeof(r)); for(i=1;i<=m;i++){ scanf("%s",s); if(mark==1){ flag[s[0]-'A']=flag[s[2]-'A']=1; if(s[1]=='>'){ map[s[2]-'A'][s[0]-'A']=1; //记录边的关系 r[s[0]-'A']++; //记录入度 } else{ map[s[0]-'A'][s[2]-'A']=1; r[s[2]-'A']++; } for(j=0;j<n;j++) rd[j]=r[j]; //辅助空间,防止过程中拓扑排序将入度改变了 mark=tpsort(); if(!mark) pos=i; if(mark&&cnt==n){ //当没有出现环且关系都确定 mark=2; pos=i; t[cnt]=0; //字符数组最后附空字符 } } } if(mark==0) printf("Inconsistency found after %d relations.\n",pos); else if(mark==1) printf("Sorted sequence cannot be determined.\n"); else if(mark==2) printf("Sorted sequence determined after %d relations: %s.\n",pos,t); } return 0; }
poj 1094 Sorting It All Out (拓扑排序)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。