http://acm.pku.edu.cn/JudgeOnline/problem?id=1094
Код:
#include<stdio.h> #include<string.h> int n,m; int g[30][30]; int use[30]; int num; void floyd() { for(int k=0;k<n;k++) for(int j=0;j<n;j++) for(int i=0;i<n;i++) if(g[j][k]&&g[k][i]) g[j][i]=1; } int con() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(g[i][j]&&g[j][i]) { printf("Inconsistency found after %d relations.\n",num); return 1; } return 0; } int isok() { int flag[30][30]; int t=0,i,j; memcpy(flag,g,sizeof(g)); memset(use,0,sizeof(use)); while(++t<=n) { int count=0; int temp; for(i=0;i<n;i++) if(use[i]==0) { int flag1=1; for(j=0;j<n;j++) flag1*=!flag[j][i]; if(flag1) { count++; temp=i; } } if(count>1) return 0; for(int i=0;i<n;i++) flag[temp][i]=0; use[temp]=t; } printf("Sorted sequence determined after %d relations: ",num); for(int i=1;i<=n;i++) for(int j=0;j<n;j++) if(use[j]==i) printf("%c",j+'A'); printf(".\n"); return 1; } void init() { int d=0; char a,b,c; memset(g,0,sizeof(g)); for(int i=1;i<=m;i++) { num=i; scanf("%c%c%c",&a,&b,&c); getchar(); g[a-'A'][c-'A']=1; if(d) continue; floyd(); if(con()) d=1; if(d==0) if(isok()) d=1; } if(d==0) printf("Sorted sequence cannot be determined.\n"); } int main() { while(scanf("%d%d",&n,&m)&&n) { getchar(); init(); } return 0; }