POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39602 | Accepted: 13944 |
Description
An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.
Input
Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.
Output
For each problem instance, output consists of one line. This line should be one of the following three:
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.
where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.
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
分析:
有向图判环:拓扑排序
无向图判环:并查集
本题需要进行m次的拓扑排序
拓扑排序判环:拓扑之后,如果存在没有入队的点,那么该点一定是环上的点
拓扑路径的唯一性确定:队中某一时刻存在两个元素,则至少有两条不同的拓扑路径
#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; }
心之所向,素履以往
分类:
ACM
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥