拓撲排序是有向無環圖(dag)經常要執行的一種操作,依據這種操作可以得到該圖的拓撲序列,當然這個拓撲序列有可能不是唯一的。它也可以看成是對一系列的偏序關係進行整合成新的偏序關係,有事可能組合成全偏序的序列。總體的思想是:將圖中入度為0的點新增至佇列,假設這樣的點的數量為a。如果a=0;說明圖中含有環或者說所有的點都遍歷完全;如果a>1,說明圖中的拓撲排序可能不止一種情況,但是它絕對不可能構成乙個完全偏序佇列。
依據這種性質就可以進行圖的有無環的判定及是否可以構成完全偏序佇列的判定。
poj1094就是一道類似的題:
#include
#include
#include
#include
#define inf 50
#define maxnum 30
using
namespace
std;
int n,m;
int sign[maxnum][maxnum];//記錄頂點之間的偏序關係
int indegree[maxnum];//記錄每乙個頂點的入度
int q[maxnum];//用陣列來完成佇列的功能
//拓撲排序,看是否可以組成
int topsort() //拓撲排序
//查詢入度為零的頂點個數
if(m==0) return
0; //有環
if(m>1) flag=-1; // 無序
q[c++]=loc; //入度為零的點入隊
temp[loc]=-1;//該點已經被考慮
for(j=1;j<=n;j++)
if(sign[loc][j]==1) temp[j]--;//從該點出發的邊所到達的點的入度減一
}return flag;
}int main()
else
if(s==1)
}if(flag==1)
// if(q.size()==0)return 0;
// int k=0;int flag=1;
// while(!q.empty())
// cout<<"******k="// if(q.size()>1)flag=-1;//這個判斷會提前將flag置為-1,是有問題的
// }
// return flag;
//}//我自己寫的**在處理輸入資訊有矛盾和輸入的資訊不足時有bug。就是不能區分兩者,總是把輸入資訊錯誤當成是輸入資訊不足來處理
//看了大神的**之後發現,在處理每乙個頂點時,大神的**每次只是允許乙個頂點進入佇列,而我的**裡面是先把所有入度為0的
//頂點加入佇列,然後每次進行佇列中元素數量的判斷。這樣操作是不正確的,應該每次使乙個入度為0的點進入佇列然後進行相應的判斷和操作
POJ 1094 拓撲排序
文章大意是將n個字母排序 n 26 最終必須排成鍊錶式的輸出 一旦確定或者出現環,記錄當前步數,後續輸入無視 加個拓撲排序判斷圖的總結 1 如果輸入的有向圖中的點,不存在入度為0的點,則存在迴路,反過來則不成立 2 如果入隊的點的個數小於輸入的點的個數,則肯定存在迴路 3 如果存在的入度為零的點大於...
拓撲排序 poj1094
此題題目有點小問題,那也是很多人ac不了的原因 問題是,當給定的前k項條件能夠確定出大小順序時,即便k項之後出現了矛盾條件,輸出也應該是sorted sequence determined after k relations 後面再輸出排序好的序列!include include using nam...
POJ 1094 拓撲排序)
拓排 各種判 program p1094 type map3 record indegree array a z of longint map array a z 1.26 of char outdegree array a z of longint end var n,m,i,j,num,valu...