标签:math.h tput sequence cts obj algorithm osi ini ring
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39602 | Accepted: 13944 |
Description
Input
Output
Sample Input
4 6 A<B A<C B<C C<D B<D A<B 3 2 A<B B<A 26 1 A<Z 0 0
Sample Output
Sorted sequence determined after 4 relations: ABCD. Inconsistency found after 2 relations. Sorted sequence cannot be determined.
Source
#include<stdio.h> #include<iostream> #include<math.h> #include<string.h> #include<set> #include<map> #include<list> #include<queue> #include<algorithm> using namespace std; typedef long long LL; int mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int getval() { int ret(0); char c; while((c=getchar())==‘ ‘||c==‘\n‘||c==‘\r‘); ret=c-‘0‘; while((c=getchar())!=‘ ‘&&c!=‘\n‘&&c!=‘\r‘) ret=ret*10+c-‘0‘; return ret; } #define max_v 55 int indgree[max_v]; int temp[max_v]; int G[max_v][max_v]; int tp[max_v]; int n,m; queue<int> q; int tpsort() { while(!q.empty()) q.pop(); for(int i=1;i<=n;i++) { indgree[i]=temp[i]; if(indgree[i]==0) q.push(i); } int c=0,p; int flag=0; while(!q.empty()) { if(q.size()>1) flag=1; p=q.front(); q.pop(); tp[++c]=p; for(int i=1;i<=n;i++) { if(G[p][i]) { indgree[i]--; if(indgree[i]==0) q.push(i); } } } /* 拓扑完之后,存在没有入队的点,那么该点就一定是环上的 */ if(c!=n)//存在环 return 1; else if(flag)//能拓扑但存在多条路 return 0; return -1;//能拓扑且存在唯一拓扑路径 } int main() { int x,y; char c1,c2; while(~scanf("%d %d",&n,&m)) { if(n==0&&m==0) break; memset(G,0,sizeof(G)); memset(temp,0,sizeof(temp)); memset(tp,0,sizeof(tp)); int flag1=0,index1=0;//是否有环及环的位置 int flag2=0,index2=0;//能否拓扑和拓扑的位置 for(int i=1;i<=m;i++) { getchar(); scanf("%c<%c",&c1,&c2); x=c1-‘A‘+1; y=c2-‘A‘+1; if(flag1==0&&flag2==0) { if(G[y][x])//环的一种情况 { flag1=1; index1=i; continue; } if(G[x][y]==0)//预防重边 { G[x][y]=1; temp[y]++; } int k=tpsort(); if(k==1)//存在环 { flag1=1; index1=i; continue; }else if(k==-1)//存在唯一拓扑路径 { flag2=1; index2=i; } } } if(flag1==0&&flag2==0) { printf("Sorted sequence cannot be determined.\n"); }else if(flag1) { printf("Inconsistency found after %d relations.\n",index1); }else if(flag2) { printf("Sorted sequence determined after %d relations: ",index2); for(int i=1;i<=n;i++) { printf("%c",tp[i]+‘A‘-1); } printf(".\n");//!!!注意还有个点... } } return 0; }
POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
标签:math.h tput sequence cts obj algorithm osi ini ring
原文地址:https://www.cnblogs.com/yinbiao/p/9834709.html