拓撲排序(鄰接矩陣)

#include <stdio.h>
#include <stdlib.h>


#define STACK_SIZE 30
#define Max_Vetex_Num 100
typedef struct {
    int vexs[Max_Vetex_Num];
    int arcs[Max_Vetex_Num][Max_Vetex_Num];
    int vexnum,arcnum;
}Mgraph;
typedef struct{
    int *base;
    int *top;  //棧頂指針
    int size;
}seqStack;
int InitStack(seqStack *s){
    s->base = (int *)malloc(STACK_SIZE* sizeof(seqStack));//動態分配30個單位的stack
    //省略是否空間滿
    s->top = s->base;//棧頂和棧尾相同,棧裏面沒有元素
    s->size = STACK_SIZE;
    return 1;
}
int Push(seqStack *s,int x){

    *s->top = x;
    s->top++;
    return 1;
}
int Pop(seqStack *s,int *x){
    if(s->top == s->base)return 0;
    else{
        s->top--;
        *x = *s->top;
        return 1;
    }
}
int IsEmpty(seqStack *s){
    if(s->top==s->base){
        return 1;
    }else{
        return 0;
    }
}
int GetTop(seqStack *s, int *x){
    if(s->top==s->base)
        return 0;
    else{
        *x=*(s->top-1);
        return 1;
    }
}
void FindIndegree(Mgraph *G,int indegree[])
{
    int i;
    int j;

    for(i = 0;i<G->vexnum ;i++)
    {
        for(j= 0;j<G->vexnum;j++)
        {
            if(G->arcs[j][i]==1){
                indegree[i]++;
            }
        }
    }/*for*/

}/*end*/


void TopSort(Mgraph *G){
    int i,j,k;
    int count;

    int indegree[G->vexnum];
    for(i = 0;i<G->vexnum ;i++)
    {
        indegree[i] = 0;
    }
    FindIndegree(G,indegree);

    seqStack s;
    InitStack(&s);
    for(i = 0;i<G->vexnum;i++)
    {
        //入度爲0的頂點入棧
        if(indegree[i]==0){
            Push(&s,i);
        }
    }
    count =0;

    while(!IsEmpty(&s)){
        Pop(&s,&i);
        printf("%d ",i);
        ++count;
        int x;

        for(x = 0;x<G->vexnum;x++){
            k = G->arcs[i][x];
            if(k==1){
                if((--indegree[x]==0)){
                    Push(&s,x);
                }
            }/*if*/
        }/*for*/
    }/**/
    /*迴路異常*/
    if(count<G->vexnum){
        exit(0);
    }
}

void CreateMGraph(Mgraph *G){
    int type;
    int i,j,k,w;
    int v1,v2;
    scanf("%d,%d",&(G->vexnum),&(G->arcnum));
    //自動構造頂點信息爲index
    for(i=0;i<G->vexnum;i++)
    {
        G->vexs[i]=i;
    }
    //初始化鄰接矩陣,全部爲0
    for(i=0;i<G->vexnum;i++){
        for(j=0;j<G->vexnum;j++){
            G->arcs[i][j]=0;
        }
    }

    //輸入每行一個邊的偶對,如v1,v2
    for(k=0;k<G->arcnum;k++)
    {
        scanf("%d,%d",&v1,&v2);

        G->arcs[v1][v2]=1;
    }

    //PrintVex(G);
}

int main()
{
    Mgraph G;
    CreateMGraph(&G);
    //PrintVex(&G);
    TopSort(&G);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章