拓撲排序:
用於排列事件發生的順序,也可判斷圖中是否有環。
代碼實現:
#include<stdio.h>
#include<stdlib.h>
#define MaxVexNum 50
#define MaxInt 32767
#define MaxEdgeNum 50
//鄰接矩陣
typedef int VertexType;
typedef int EdgeType;
typedef struct AMGraph{
VertexType vexs[MaxVexNum];//頂點表
EdgeType arcs[MaxVexNum][MaxVexNum];//鄰接矩陣表
int vexnum,edgenum;//頂點數,邊數
}AMGraph;
void createGraph(AMGraph &g){//創建無向圖
printf("請輸入頂點數:");
scanf("%d",&g.vexnum);
printf("\n請輸入邊數:");
scanf("%d",&g.edgenum);
//初始化頂點表
for(int i=1;i<=g.vexnum;i++){
g.vexs[i]=i;
}
for(int i=1;i<=g.vexnum;i++){
for(int j=1;j<=g.vexnum;j++){
g.arcs[i][j]=MaxInt;
if(i==j) g.arcs[i][j]=0;
}
}
printf("請輸入邊的信息以及邊的權值(頂點是0~n-1)\n");
for(int i=0;i<g.edgenum;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
g.arcs[x][y]=w;
//g.arcs[y][x]=w;
}
}
void PrintGraph(AMGraph g){
printf("鄰接矩陣爲:\n");
for(int i=1;i<=g.vexnum;i++) {
printf(" %d",g.vexs[i]);
}
printf("\n");
for(int i=1;i<=g.vexnum;i++){
printf("%d ",g.vexs[i]);
for(int j=1;j<=g.vexnum;j++){
if(g.arcs[i][j]==32767){
printf("∞ ");
}else{
printf("%d ",g.arcs[i][j]);
}
}
printf("\n");
}
}
void updateStack(int stack[],int &top,int set[],AMGraph &g){
for(int i=1;i<=g.vexnum;i++){
int count=0;
for(int j=1;j<=g.vexnum;j++){
if(set[i]==0&&i!=j&&g.arcs[j][i]==MaxInt){
count++;
}
}
if(count==g.vexnum-1){
stack[++top]=i;
set[i]=1;
}
}
}
//拓撲排序
//用於排列活動發生的先後次序
//也可判斷圖中是否有環
void TopSort(AMGraph g,int topsort[]){
AMGraph temp=g;
int stack[g.vexnum];
int top=-1;
int top1=0;//將拓撲序列存入
int set[g.vexnum+1];//標記數組
for(int i=1;i<=g.vexnum;i++) set[i]=0;
for(int i=1;i<=g.vexnum;i++){
int count=0;
for(int j=1;j<=g.vexnum;j++){
if(set[i]==0&&i!=j&&g.arcs[j][i]==MaxInt){
count++;
}
}
if(count==g.vexnum-1){
stack[++top]=i;
set[i]=1;
}
}
printf("拓撲排序序列爲:");
while(top!=-1){
int e=stack[top--];
printf("%d ",e);
topsort[++top1]=e;
//更新
for(int i=1;i <= temp.vexnum;i++){
if(i!=e) temp.arcs[e][i]=MaxInt;
}
//更新棧
updateStack(stack,top,set,temp);
}
}
void KeyPath(){
}
int main(){
AMGraph g;
createGraph(g);
PrintGraph(g);
int topsort[g.vexnum+1];
TopSort(g,topsort);
}
代碼運行截圖: