図のアルゴリズム。

1. Gを有向グラフことができ、Cプログラムをコンパイルし、DFSトラバーサル配列G(V0から開始)読み出しデータの構成、出力
...図N V0 VI0 V1 Vi1とV2 Vi2との形で入力を ViにVinが-1 -1(-1、-1入力端マーク、残りの値は> = 0であり、そして
それらは全て整数であり、そして100> N> 0(注:実行可能プログラムファイル名はe2.exeでなければなりません、 。)アカウントまたはdebugディレクトリの下に保存された
入力:9 1 0 0 2 0 7,121,423,353,643,457,886 -1 -1

#include<stdio.h>
#define MAX 100
typedef enum{False,True} Boolean;
int G[MAX][MAX];
int n;
//建立图的邻接矩阵G[][]
void GreateG(){
    int i,j;
    printf("Input the number of the node:");
    scanf("%d", &n);
    printf("\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            G[i][j]=0;
        }
    }   
    do{
        scanf("%d%d", &i,&j);
        G[i][j]=1;
    }while((i!=-1) && (j!=-1));
}


//拓扑排序,输出拓扑序列
void TopSort(){

    int i,j;
    //按照无前驱顶点优先思想,degree[]存放个节点的入度
    int degree[100];
    Boolean visited[MAX],flag=True;
    printf("The Topolgical Order as follow:");
    for(i=0;i<n;i++){
        degree[i]=0;
        visited[i]=False;
    }
    printf("\n");
    while(flag==True){
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                degree[i]=G[j][i]+degree[i];
            }
        }
        i=0;
        //最先输出入度为0的顶点
        while((i<n) && (degree[i]!=0) || visited[i]==True){
            i++;
        }
        //所有节点均已输出结束,否则说明存在环,无拓扑序列
        if(i<n){
            printf("%d",i);
            visited[i]=True;
            for(j=0;j<n;j++){
                G[i][j]=0;
                degree[j]=0;
            
            }
        }else{
            flag = False;
        }
        
    }
}

void main(){
    GreateG();
    TopSort();
    printf("\n");
}

おすすめ

転載: www.cnblogs.com/snail-gao/p/11774792.html
おすすめ