圖的拓撲排序問題
阿新 • • 發佈:2020-12-24
描述:
在有向無環圖,頂點之間存在先後關係,遍歷某個頂點前必須前遍歷其前驅頂點。
拓撲排序一般應用於計劃的安排:完成一項任務後才可進行下一項。
思路:
輸出圖中入度為0的頂點,並記錄其下標,之後刪除該頂點所連線的弧,重複這個過程直到圖中找不到入度為0的頂點為止。
如果執行完演算法後圖中還有頂點沒有輸出,則說明圖中存在環,輸出錯誤資訊。
程式碼:
//鄰接矩陣的定義
typedef struct AMGraph
{
int vex[ARRAYSIZE]={0};//頂點陣列
int arc[ARRAYSIZE][ARRAYSIZE];//二維陣列,表示頂點之間的關係
int vexnum=0,arcnum=0;//頂點個數和弧個數
int type=0;//1表示無向圖,2表示有向圖,3表示無向網,4表示有向網
}AMGraph;
int GetInDegree(AMGraph &G,int e);//求頂點的入度
//拓撲排序
void topo_sort(AMGraph &G)
{
int num=-1;//用於表示當前頂點的下標
set<int> record;//用於記錄已處理的頂點的下標的容器
//尋找入度為0的頂點
for(int i=0;i<G.vexnum;i++)
{
if (GetInDegree(G,G.vex[i])==0)
num=i;
}
int n=record.size();
while(num!=-1 && n!=G.vexnum)
{
cout << G.vex[num] << endl;
record.insert(num);//記錄已處理的頂點的下標
//刪除該頂點所連線的弧
for(int i=0;i<G.vexnum;i++)
{
if(G.type== 2)
G.arc[num][i]=0;
else if(G.type==4)
G.arc[num][i]=INT_MAX;
}
num=-1;
//尋找入度為0的頂點
for(int i=0;i<G.vexnum;i++)
{
//檢測第i個頂點是否已處理過,有則continue
if(record.find(i)==record.end())
{
if(GetInDegree(G,G.vex[i])==0)
{
num=i;
break;
}
}
else continue;
}
}
if(n!=G.vexnum)//退出迴圈後若圖中還有頂點未輸出,說明圖中存在環
{
cout << "出錯!圖中存在環" << endl;
}
}