能夠將$A<B$當作$A$和$B$之間有一條權值爲1有向邊,那麼$A-B$的值就表示爲排完序後,$A$在$B$前面幾位。c++
而後分狀況,判斷結果爲第1,2,3種中的哪種。數組
判斷結果爲第1種的方法函數
若是有剛好有$(n-1)*n/2$條邊沒有被更新,說明結果確定爲第1種。spa
爲何呢?code
由於當能將這些變量排序時,鄰接矩陣的狀況必定是這個亞子的:排序
x1 x2 x3 x4 x5 ... xn x1 0 1 2 3 4 ... n-1 x2 -1 0 1 2 3 ... n-2 x3 -1 -1 0 1 2 ... n-3 x4 -1 -1 -1 0 1 ... n-4 x5 -1 -1 -1 -1 0 ... n-5 ... xn -1 -1 -1 -1 -1 ... 0 "-1"表示A-B之間沒有邊,xi表示排在第i位的變量
因此沒被更新的邊的數量必定爲$(n-1)*n/2$。ci
判斷結果爲第2種的方法get
若是找到兩個變量$A,B$,$A$在$B$前面,$B$也在$A$前面,那麼這確定矛盾了,因此結果確定爲第2種。it
判斷結果爲第3種的方法io
若是結果不爲第1,2種,那麼結果確定爲第3種。
#include<bits/stdc++.h> using namespace std; int Map[30][30]; int ans[30]; int n,m,flag; //flag=1表示結果爲第1種,flag=-1表示結果爲第2種,flag=0表示結果爲第3種 inline void get(int &u,int &v)//獲得邊的信息 { char ch=getchar(); while(ch>'Z'||ch<'A') ch=getchar(); u=ch-'A',ch=getchar(); while(ch>'Z'||ch<'A') ch=getchar(); v=ch-'A'; } inline void floyd(int u,int v)//將圖更新 { for(register int i=0;i<n;i++) for(register int j=0;j<n;j++) if(Map[i][j]<Map[i][u]+1/* 1表示u,v之間有一條權值爲1的單向邊 */+Map[v][j]) Map[i][j]=Map[i][u]+1+Map[v][j]; //若是Map[i][j]<Map[i][u]+1+Map[v][j],說明i-j之間還有u和v,因而更新Map[i][j]的值 //這裏不用單獨更新u-v,當i==u,j==v時就已經更新了 } inline void check(int now)//判斷結果爲第1,2,3種中的哪種 { if(flag) return; //判斷結果是否爲第2種 for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(Map[i][j]>0&&Map[j][i]>0) flag=-1; //若是j在i前面且i在j前面,那麼結果爲第二種 if(flag==-1){ans[0]=now;return;} //判斷結果是否爲第1種 if(now<n-1) return;//若是操做序列次數<n-1確定結果不爲第1種 int tot=0,p,tf; //tot爲有多少條邊還沒被更新,p爲在最前面的變量,tf爲當前變量是否在最前面 for(int i=0;i<n;i++){ tf=1; for(int j=0;j<n;j++) if(Map[i][j]<0) tot++,tf=0; //若是這個變量不能到達其餘全部變量,那麼他就不在最前面 if(tf) p=i; } if(tot!=(n-1)*n/2) return; flag=1,ans[0]=now; //更新ans數組 for(int i=0;i<n;i++) ans[Map[p][i]+1]=i; } inline void print()//輸出函數 { if(flag){ if(flag==1){ printf("Sorted sequence determined after %d relations: ",ans[0]); for(int i=1;i<=n;i++) printf("%c",ans[i]+'A'); puts("."); } else printf("Inconsistency found after %d relations.\n",ans[0]); } else puts("Sorted sequence cannot be determined."); } int main() { while(cin>>n>>m){ //初始化 memset(Map,-10,sizeof Map); for(int i=0;i<n;i++) Map[i][i]=0; flag=0; //輸入 int u,v; for(int i=1;i<=m;i++){ get(u,v); floyd(u,v); if(flag) continue; check(i); } //輸出 print(); } return 0; } /* Sorted sequence determined after () relations: (). Inconsistency found after () relations. Sorted sequence cannot be determined. */