#include<stdio.h>
#include <stdlib.h>
#define max 100
typedef struct{
int vex[max];
int ArcNode[max][max];
int vexnum,arcnum;
}Graph;
void create(Graph *G){
int i,j,ves,arcs,x,y,w;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&ves,&arcs);
G->vexnum=ves;
G->arcnum=arcs;
// printf("%d",G->vexnum);
for (i=0;i<G->vexnum;i++) {
printf("输入第%d个顶点信息:",(i+1));
scanf("%d",&G->vex[i]);
}
// 初始化两个顶点之间没有边就写max
for(i=0;i<G->vexnum;i++){
for (j=0; j<G->vexnum;j++)
G->ArcNode[i][j]=0;
}
printf("请输入两个顶点: \n");
for(j=0;j<G->arcnum;j++){
scanf("%d %d",&x,&y);
G->ArcNode[x-1][y-1]=1;
// G->ArcNode[y-1][x-1]=w;
}
for( i=0;i<G->vexnum;i++){
for( j=0;j<G->vexnum;j++){
printf("%d ",G->ArcNode[i][j]);
}
printf("\n");
}
}
// 拓扑排序
void topologicalSort(Graph G,int indegree[max]){
int ves[max];
int vset[max]={0};
int k,top=0;
for(int i=0;i<G.vexnum;i++){
if(indegree[i]==0)
ves[top++]=i;
}
printf("拓扑序列为:");
for(int i=0;i<G.vexnum;i++){
k=ves[--top];
// printf(" >%d< ",k);
vset[k]=1;
printf("%d->",G.vex[k]);
for(int j=0;j<G.vexnum;j++){
if(G.ArcNode[k][j]==1){
--indegree[j];
if(indegree[j]==0&&vset[j]!=1){
// printf(" {%d} ",j);
ves[top++]=j;
}
}
}
}
}
//查询节点入度
void getIndegree(Graph G,int degree[max]){
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++)
if(G.ArcNode[i][j]==1)
degree[j]++;
}
}
int main(){
Graph G;
create(&G);
int degree[max];
for(int i=0;i<G.vexnum;i++)
degree[i]=0;
getIndegree(G,degree);
for(int i=0;i<G.vexnum;i++){
printf("%d ",degree[i]);
}
topologicalSort(G,degree);
return 0;
}
拓扑排序(领接矩阵)
最新推荐文章于 2024-07-08 16:11:01 发布