有向图建立邻接矩阵并实现拓扑排序

拓扑排序

本排序的图的建立参考之前写的邻接矩阵的建立

因为之前的图建的是无向图,所以建图时只需G->side[vi][vj]=1;一步

#include
#include
#include
#define Max 100 //假设包含100个顶点
typedef struct{ //包含权的邻接矩阵的的定义
    int point[Max];  //顶点信息的数组
    int side[Max][Max]; //边的权信息的数组
    int nowp; //创建图的顶点数
    int nows; //创建图的边数
}map;
int indegree[Max];
void CreateGraph(map *G) //图的生成函数
{ 
memset(indegree,0,sizeof(indegree));
    int n,e,vi,vj,w,i,j;
    printf("请输入图的顶点数和边数:");
    scanf("%d%d",&G->nowp,&G->nows);
    memset(G->side,0,sizeof(G->side));
 //   for(i=1;i<=G->nowp;i++) //图的初始化
//        for(j=1;j<=G->nowp;j++)
//            { 
//            if(i==j)
//                G->side[i][j]=0;//对角线均初始化为0 
//            else 
//                G->side[i][j]=-1;//其余全初始化为-1,-1为两点未连接 
 //           }//因为是排序各点,所以不需要对路径上权赋值
        for(i=1;i<=G->nowp;i++) //将顶点存入数组中
        { 
            printf("请输入第%d个顶点的信息(整型):",i);
            scanf("%d",&G->point[i]);
        }
    printf("\n");

    for(i=1;i<=G->nows;i++)
    { 
        printf("请输入边的信息第a个点,第b个点:");
        scanf("%d%d",&vi,&vj); 
        indegree[vj]++;
        G->side[vi][vj]=1;
        //G->side[vj][vi]=w;排序为有向图,所以不需要关于对角线对称赋值
        
    }
}
void print(map G) //输出邻接矩阵的信息
{ 
    int i,j;
    printf("\n输出顶点的信息(整型):\n");
    for(i=1;i<=G.nowp;i++)
        printf("%8d",G.point[i]);

    printf("\n输出邻接矩阵:\n");
    printf("\t");
    for(i=1;i<=G.nowp;i++)
        printf("%8d",G.point[i]);
printf("\n");
    for(i=1;i<=G.nowp;i++)
    { 
        printf("\n%8d",G.point[i]);
        for(j=1;j<=G.nowp;j++)
        { 
            printf("%8d",G.side[i][j]);
        }
        printf("\n");   
    }
}
void toposort(map G)//拓扑排序
{
    int i,j,k;
    for(i=1;i<=G.nowp;i++) //遍历G.nowp次,为点的个数
    {
        for(j=1;j<=G.nowp;j++) 
        {
            if(indegree[j]==0)//入度为零时操作
            {
                indegree[j]--;//入度--
                printf("%4d",G.point[i]);输出该点的值
                for(k=1;k<=G.nowp;k++) 
                {
                    if(G.side[j][k]==1)//如果有该点向后的连线,将连线取消
                    {
                    	G.side[j][k]=0;
                        indegree[k]--;//被连线的点入度--
                    }
                }
                break;
            }
        }
    }
}

int main()
{ 
    map G;
    CreateGraph(&G);
    print(G);
    printf("\n对图拓扑排序为:\n");
    toposort(G);
    return 0;
}

你可能感兴趣的:(图,拓扑排序)