拓扑排序
本排序的图的建立参考之前写的邻接矩阵的建立
因为之前的图建的是无向图,所以建图时只需G->side[vi][vj]=1;
一步
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#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;
}