1. 程式人生 > 其它 >POJ-1094-Sorting It All Out

POJ-1094-Sorting It All Out

題目連結 http://poj.org/problem?id=1094

題目大意:
一共有N個變數,給出M個關係

1.如果給出關係之間有矛盾,則輸出
Inconsistency found after D relations.
其中D為在給出的第D中關係中發現有矛盾

2.如果沒有矛盾並且在前d個關係中找出所有變數之間的大小關係,則輸出:
Sorted sequence determined after d relations: ABCD.
ABCD 表示 A < B < C < D
也就是說如果我們在第6個關係後知道
A < C < D < B
那我們輸出的就是
Sorted sequence determined after 6 relations: ACDB.

3.如果沒有矛盾但是卻判斷不出所有變數的大小關係,則輸出:
Sorted sequence cannot be determined.


唯一拓撲序問題。將入度為0的點放入答案陣列,如果可以得出關係則輸出就可。

根據題目大意可以看出,給定一組字母大小關係後需要依次判斷:

1、該序列字母間是否有矛盾,即是否能形成環

2、該序列字母是否有序,若有序則輸出

3、該序列無序

我們判斷完前兩步後已經遍歷完整個圖才可以確定第三步,並且當1、2得出結果後(有矛盾或者有序且輸出),後面的輸入不再起作用。


放AC程式碼

 1 #include<bits/stdc++.h>
 2 using namespace
std; 3 int n,m; 4 int mapp[26][26],in[26],temp[26],ans[26]; 5 char s[5]; 6 7 int toupu() 8 { 9 int now,tail=-1,flag=1; 10 for(int i=0; i<n; i++) 11 {//後面會修改入度數,所以將每個點的入度用臨時陣列儲存 12 temp[i]=in[i]; 13 } 14 for(int i=0; i<n; i++) 15 {//把每個入度為0的點刪除,遍歷n個點 16 int
num=0;//入度為0的點的個數 17 for(int j=0; j<n; j++) 18 { 19 if(temp[j]==0) 20 { 21 now=j; 22 num++; 23 } 24 } 25 26 if(num==0) return -1;//沒有入度為0的點證明存在環,關係矛盾,直接退出 27 if(num>1) flag=0;//有大於一個入度為0的點,但無法判斷出關係,可能有環存在還沒有判斷到 28 29 ans[++tail]=now; 30 temp[now]=-1;//標記此點已被判斷過,避免重複判斷 31 for(int k=0; k<n; k++) 32 {//入度-1 33 if(mapp[now][k]==1) 34 temp[k]--; 35 } 36 } 37 return flag; 38 } 39 40 int main() 41 { 42 while(scanf("%d%d",&n,&m)!=EOF) 43 { 44 memset(mapp,0,sizeof(mapp)); 45 memset(in,0,sizeof(in)); 46 if(n==0 && m==0) return 0; 47 int sign=0;//若sign=1表示已經確定並輸出結果 48 49 for(int i=0; i<m; i++) 50 { 51 scanf("%s",s); 52 if(sign) continue;//已經輸出結果,不再對後面的輸入做處理 53 int a=s[0]-'A'; 54 int b=s[2]-'A'; 55 mapp[a][b]=1; 56 in[b]++; 57 58 int flag=toupu();//每給出一條邊就要重新判斷三個條件,判斷當前已知條件能否得出結果 59 if(flag==-1) 60 {//關係矛盾 61 printf("Inconsistency found after %d relations.\n",i+1); 62 sign=1; 63 } 64 else if(flag) 65 {//可得關係 66 printf("Sorted sequence determined after %d relations: ",i+1); 67 for(int i=0; i<n; i++) 68 printf("%c",ans[i]+'A'); 69 printf(".\n"); 70 sign=1; 71 } 72 } 73 if(sign==0)//無法得出關係 74 printf("Sorted sequence cannot be determined.\n"); 75 } 76 return 0; 77 }