⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 括扑排序.cpp

📁 拓扑排序
💻 CPP
字号:
#include<iostream.h>
#include<malloc.h>
#define max 100
typedef enum{DG,DN,UDG,UDN}graphkind;
typedef struct arcnode{
	int adjvex;
	struct arcnode*nextarc;
}arcnode;
typedef struct vnode{
	int data;
	int ind;
	arcnode* firstarc;
}vnode;
typedef struct{
	vnode adjlist[max];
	int vexnum,arcnum;
	graphkind kind;
}algraph;
void create(algraph *g)
{
	int i,k,j;
	arcnode*s;
	cout<<"输入顶点数:";cin>>g->vexnum;
    cout<<"输入边数:";cin>>g->arcnum;
	g->kind=DG;
	for(i=0;i<g->vexnum;i++)
	{
		g->adjlist[i].data=i;
		g->adjlist[i].firstarc=NULL;
	}
	for(k=0;k<g->arcnum;k++)
	{
		cout<<"输入第"<<k+1<<"条边(节点从0到"<<g->vexnum-1<<"):";
		cin>>i>>j;
		s=(arcnode*)malloc(sizeof(arcnode));
		s->adjvex=j;
		s->nextarc=g->adjlist[i].firstarc;
		g->adjlist[i].firstarc=s;
	}
}
void finddegree(algraph *g)
{
	arcnode*s;
	int count=0,i,j;
	for(j=0;j<g->vexnum;j++)
	{
		for(i=0;i<g->vexnum;i++)
		{
			s=g->adjlist[i].firstarc;
			while(s)
			{
				if(s->adjvex==j)
					count++;
				s=s->nextarc;
			}
			g->adjlist[j].ind=count;
		}
		count=0;
	}
	cout<<"输出各顶点的入度:";
	for(i=0;i<g->vexnum;i++)
		cout<<g->adjlist[i].ind<<" ";
	cout<<endl;
}
void topologicalsort(algraph g)
{
	int stack[max],top,i,count,k;
	arcnode*s;
	top=-1;
	for(i=0;i<g.vexnum;i++)
		if(g.adjlist[i].ind==0) 
			stack[++top]=i;
	count=0;
	if(top>-1)
	{
		cout<<"输出拓扑排序序列:";
	    while(top!=-1)
		{
			i=stack[top--];
		    cout<<g.adjlist[i].data<<" ";
		    count++;
		    s=g.adjlist[i].firstarc;
		    while(s)
			{
				k=s->adjvex;
		        if(!(--g.adjlist[k].ind)) stack[++top]=k;
			    s=s->nextarc;
			}
		}
	}
	cout<<endl;
	if(count<g.vexnum) cout<<"该有向图有回路!"<<endl;
}
void main()
{
	algraph g;
	create(&g);
	finddegree(&g);
	topologicalsort(g);
}

	




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -