poj1094 拓扑排序

来源:互联网 发布:数控铣床编程好学吗 编辑:程序博客网 时间:2024/06/08 10:57
拓扑排序的应用:
1、当前的输入序列排序唯一,则输出 Sorted sequence determined after %d relations
2、当前输入序列不唯一,检查是否有环
3、全部输入后,若排序唯一和有环,输出1、2,否则输出 Sorted sequence cannot be determined
拓扑排序 每次选点入度为0的点唯一 则排序唯一
否则排序结果不唯一
若某次选择点,不存在入度为0的点,则有环

#include <stdio.h>#include <string.h>int topo(int succ[][26],int *inp,int *outp,int n,int *numbersucc,int *result){int in[26],out[26];int i,j,firstnode,cnt,k=0,tempnode;bool isonly = true;for (i=0;i<n;i++){in[i] = inp[i];out[i] = outp[i];}while(1){cnt = 0;for (i=0;i<n;i++){if (in[i]==0) //找入度为0的点 并统计个数{cnt++;if (cnt==1)firstnode = i;if (cnt>1)isonly = false ; //在排序的过程中有一次入度为0 的点 不唯一排序不唯一}}if (cnt==0) //没有入度为0的点 说明存在环return 2;*(result+k) = firstnode;in[firstnode] = -1; //已排好 k++; //k代表已经排好序的数量if (k==n)break;for (i=0;i<numbersucc[firstnode];i++){tempnode = succ[firstnode][i];in[tempnode] -- ;out[firstnode] -- ;}}if (isonly)return 1;elsereturn 0;}int main(){int n,m,i,j,succnode[26][26],indegree[26],outdegree[26],flag,numbersucc[26],result[26];bool succ[26][26];char A,B;while(1){scanf("%d%d",&n,&m);if (n==0&&m==0)break;memset(succ,false,sizeof(succ));memset(indegree,0,sizeof(indegree));memset(outdegree,0,sizeof(outdegree));memset(succnode,-1,sizeof(succnode));memset(numbersucc,0,sizeof(numbersucc));flag = 0;for (i=1;i<=m;i++){getchar();scanf("%c",&A);getchar();scanf("%c",&B);if (!flag){B -= 'A';A -= 'A';if (succ[B][A] == false) //从来没出现过 若之前出现过可以pass掉{succ[B][A] = true; //B后面跟着A indegree[A]++;outdegree[B]++;succnode[B][numbersucc[B]++] = A; // flag = topo(succnode,indegree,outdegree,n,numbersucc,result);if (flag == 1){printf("Sorted sequence determined after %d relations: ",i);for (j=n-1;j>=0;j--)printf("%c",result[j]+'A');printf(".\n");}else if (flag == 2){printf("Inconsistency found after %d relations.\n",i);}}}}if (flag == 0)printf("Sorted sequence cannot be determined.\n");}return 0;}


	
				
		
原创粉丝点击