[poj1094]Sorting It All Out_拓撲排序
阿新 • • 發佈:2018-03-20
rmi BE pan post 有環 數據 spa 但是 class
Sorting It All Out poj-1094
題目大意:給出一些字符串之間的大小關系,問能否得到一個唯一的字符串序列,滿足權值隨下標遞增。
註釋:最多26個字母,均為大寫。
想法:顯然,很容易想到用toposort處理,對於每一個剛剛讀入的大小關系,我們對進行一次拓撲排序,由於點數最多是26,所以總時間復雜度是$10^2$的。然後通過題面,可以發現第一個和第三個判定依據是可以中途退出的,而第二個條件是必須最後才可以判斷的。但是由於poj的多組數據,我們必須要將所有的數據都讀入完畢才能達到題目要要求。
最後,附上醜陋的代碼... ...
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; int map[27][27],indegree[27],q[27]; int TopoSort(int n) //拓撲排序 { int c=0,temp[27],loc,m,flag=1,i,j; ////flag=1:有序 flag=-1:不確定 for(i=1;i<=n;i++) temp[i]=indegree[i]; for(i=1;i<=n;i++) { m=0; for(j=1;j<=n;j++) if(temp[j]==0) { m++; loc=j; } //查找入度為零的頂點個數 if(m==0) return 0; //有環 if(m>1) flag=-1; // 無序 q[c++]=loc; //入度為零的點入隊 temp[loc]=-1; for(j=1;j<=n;j++) if(map[loc][j]==1) temp[j]--; } return flag; } int main() { int m,n,i,sign; //當sign=1時,已得出結果 char str[5]; while(scanf("%d%d",&n,&m)) { if(m==0&&n==0) break; memset(map,0,sizeof(map)); memset(indegree,0,sizeof(indegree)); sign=0; for(i=1;i<=m;i++) { scanf("%s",str); if(sign) continue; //一旦得出結果,對後續的輸入不做處理 int x=str[0]-‘A‘+1; int y=str[2]-‘A‘+1; map[x][y]=1; indegree[y]++; int s=TopoSort(n); if(s==0) //有環 { printf("Inconsistency found after %d relations.\n",i); sign=1; } if(s==1) //有序 { printf("Sorted sequence determined after %d relations: ",i); for(int j=0;j<n;j++) printf("%c",q[j]+‘A‘-1); printf(".\n"); sign=1; } } if(!sign) //不確定 printf("Sorted sequence cannot be determined.\n"); } return 0; }
小結:toposort還是很有用的。
[poj1094]Sorting It All Out_拓撲排序