拓扑排序(有向图)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingongzi/article/details/85886900
#include<stdio.h>
#include<string.h>
int map[100][100];//邻接矩阵 
int indegree[100]={0};//每个节点入度个数 
int book[100]={0};//标记节点是否被使用 
int n,m;//n为节点个数,m为边数 

void TuopuSort()
{//实现拓扑排序 
	int i,j;
	int ans=1;//记录此时已经被使用节点个数 
	while(ans<=n)
	{
		for(i=1;i<=n;i++)
		{//循环遍历n个节点 
			if(book[i]==0&&indegree[i]==0)
			{//没有被使用 并且入度为0的节点 
				printf("%d ",i);//输出此节点 
				for(j=1;j<=n;j++)
				{//与第i个节点相连接的节点入度减一 
					if(map[i][j])
					indegree[j]--;
				}
				book[i]=1;//标记i节点被使用过 
				ans++;//节点使用个数加一 
				break;//找到一个符合条件的节点结束第二层循环 
			}
		}
	}
	printf("\n");
	return ;	
}
int main()
{
	int i,j,x,y;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		if(!map[x][y])
		{//map[][]=1代表有边 
			map[x][y]=1;
			indegree[y]++;//入度加一 
		}
	}
	TuopuSort();
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/bingongzi/article/details/85886900