1)在有向圖中選一個沒有前驅(入度爲0)的頂點且輸出之。
2)從圖中刪除該頂點及它發出的弧(這樣就得到了別的入度爲0的頂點)。
重複上述2步,直到輸出全部頂點。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NODESIZE 100 //最大頂點數
using namespace std;
struct node{
int v; //頂點序號
struct node *next;//鄰接的下一頂點
int size;//該頂點入度數
int isUnSort;//是否已排過序
}
vNode[NODESIZE],//頂點源 做鄰接表使用
result[NODESIZE];//排序結果
//初始化頂點信息
void initNodes(int nodeSize){
for(int i=0;i<nodeSize;i++){
vNode[i].v=i;
vNode[i].size=0;
vNode[i].next=NULL;
vNode[i].isUnSort=1;
}
}
//創建一個新的頂點
struct node *createNode(int v){
struct node *newNode;
newNode=(struct node *)malloc(sizeof(struct node));
newNode->next=NULL;
newNode->v=v;
return newNode;
}
//重頭戲 拓撲排序
void topoSort(int nodeSize){
struct node *p;
for(int i=0;i<nodeSize;i++)
for(int j=0;j<nodeSize;j++)
if(vNode[j].isUnSort && vNode[j].size==0){
vNode[j].isUnSort=0;
result[i]=vNode[j];
p=&vNode[j];
while(p->next!=NULL){
p=p->next;
vNode[p->v].size--;
}
break;
}
}
int main()
{
int i,from,to,nodeSize,edgeSize;
struct node *p;
//輸入頂點數與邊數
cin>>nodeSize>>edgeSize;
initNodes(nodeSize);
//邊關係 從頂點from指向頂點to
for(i=0;i<edgeSize;i++){
cin>>from>>to;
p=&vNode[from];
while(p->next!=NULL)
p=p->next;
p->next=createNode(to);
//被指向頂點的入度增加
vNode[to].size++;
}
topoSort(nodeSize);
for(i=0;i<nodeSize;i++)
cout<<result[i].v<<endl;
return 0;
}