洛谷 P1347 排序
P1347 排序
题目描述
一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D。在这道题中,我们将给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。
输入输出格式
输入格式:
第一行有两个整数n,m,n表示需要排序的元素数量,2<=n<=26,第1到n个元素将用大写的A,B,C,D....表示。m表示将给出的形如A<B的关系的数量。
接下来有m行,每行有3个字符,分别为一个大写字母,一个<符号,一个大写字母,表示两个元素之间的关系。
输出格式:
若根据前x个关系即可确定这n个元素的顺序yyy..y(如ABC),输出
Sorted sequence determined after xxx relations: yyy...y.
若根据前x个关系即发现存在矛盾(如A<B,B<C,C<A),输出
Inconsistency found after 2 relations.
若根据这m个关系无法确定这n个元素的顺序,输出
Sorted sequence cannot be determined.
(提示:确定n个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)
输入输出样例
输入样例#1:
1: 4 6 A<B A<C B<C C<D B<D A<B 2: 3 2 A<B B<A 3: 26 1 A<Z
输出样例#1:
代码
1: Sorted sequence determined after 4 relations: ABCD. 2: Inconsistency found after 2 relations. 3: Sorted sequence cannot be determined.
虽说标签是拓扑
但是完全可以乱搞
只有26个点 嘿嘿 想怎么搞就怎么搞
每次输入先判有没有环
等n个点都出现后
再判断是否有矛盾
输入结束后上面两种情况没有出现
那就是无法确定顺序
1 #include <cstring> 2 #include <ctype.h> 3 #include <cstdlib> 4 #include <vector> 5 #include <cstdio> 6 7 const int MAXN=27; 8 9 int n,m,tot; 10 11 int ans[MAXN],out[MAXN],in[MAXN],map[MAXN][MAXN]; 12 13 bool vis[MAXN]; 14 15 std::vector<int> v[MAXN]; 16 17 inline void read(int&x) { 18 int f=1;register char c=getchar(); 19 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 20 for(;isdigit(c);x=x*10+c-48,c=getchar()); 21 x=x*f; 22 } 23 24 inline bool pd() { 25 for(int k=1;k<=n;++k) 26 for(int i=1;i<=n;++i) 27 for(int j=1;j<=n;++j) 28 map[i][j]=map[i][k]&map[k][j]|map[i][j]; 29 for(int i=1;i<=n;++i) 30 if(map[i][i]==true) return true; 31 return false; 32 } 33 34 void print(int pos,int sum,int id) { 35 ans[sum]=pos; 36 if(sum==n) { 37 printf("Sorted sequence determined after %d relations: ",id); 38 for(int i=n;i>=1;--i) 39 printf("%c",char(ans[i]+'A'-1)); 40 printf(".\n"); 41 exit(0); 42 } 43 for(int i=0;i<v[pos].size();++i) 44 print(v[pos][i],sum+1,id); 45 } 46 47 inline void judge(int id) { 48 if(pd()) { 49 printf("Inconsistency found after %d relations.",id); 50 exit(0); 51 } 52 for(int i=1;i<=n;++i) 53 if(!in[i]) { 54 print(i,1,id); 55 break; 56 } 57 } 58 59 int hh() { 60 char s[5]; 61 read(n);read(m); 62 for(int i=1;i<=m;++i) { 63 scanf("%s",s); 64 int x=s[0]-'A'+1; 65 int y=s[2]-'A'+1; 66 map[y][x]=true; 67 v[y].push_back(x),++in[x],++out[y]; 68 if(!vis[x]) ++tot,vis[x]=true; 69 if(!vis[y]) ++tot,vis[y]=true; 70 if(pd()) { 71 printf("Inconsistency found after %d relations.",i); 72 return 0; 73 } 74 if(tot==n) judge(i); 75 } 76 printf("Sorted sequence cannot be determined.\n"); 77 return 0; 78 } 79 80 int sb=hh(); 81 int main() {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现