拓扑排序

按入度为0的序列排序,找到一个删除一个

#include<stdio.h>
#include<string.h>
#define MAXN 1000
int in[MAXN];//记录入度数
int p[MAXN][MAXN];//记录两点是否相连
int n,m;//m为边数,n为节点数 (1~n)
void toposort()
{
	for(int i=1 ; i<=n ; i++)//n个点,一次删除一个,所以要遍历n次 
	{
		for(int j=1 ; j<=n ; j++)
		{
			if(in[j]==0)
			{
				in[j]=-1;//入度为-1,标记为已被删除 
				printf("%d",j);
				if(i!=n) printf(" ");
				else	printf("\n");
				for(int k=1 ; k<=n ; k++)
				{
					if(p[j][k])
					{
						in[k]--;
					}
				}
				break;//找到了就跳出,然后遍历找下一个 
			}
		}
	}
}

int main()
{
	int x,y;
	while(~scanf("%d %d",&n ,&m ))
	{
		memset(in,0,sizeof(in));
		memset(p,0,sizeof(p));
		for(int i=0 ; i<m ; i++)
		{
			scanf("%d %d",&x,&y);
			if(!p[x][y])//杜绝重复输入对入度数带来的影响 
			{
				p[x][y]=1;
				in[y]+=1;
			}
		}
		toposort();
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值