poj2367Genealogical tre

3 篇文章 0 订阅
2 篇文章 0 订阅

原题连接:http://poj.org/problem?id=2367

思路:拓扑排序

#include<stdio.h>
#include<stdlib.h>
typedef struct vert
{
	int num;           //结点编号
	struct vert* next;
}G_v;
typedef struct node
{
	int InDgree,OutDgree;            //出度和入度
	G_v* next;
}G_n;
G_n P[101];                         //结点
int main(void)
{
	G_v *tmp;
	G_v *q;
	int n,i,a,j,count;
	scanf("%d",&n);
	for(i = 0;i <= n;i ++)
	{
		P[i].next = NULL;
		P[i].InDgree = P[i].OutDgree = 0;
	}
	i = 1;
	while(i <= n)
	{
		tmp = P[i].next;
		while(scanf("%d",&a)&&a != 0)
		{
			P[i].OutDgree ++;
			P[a].InDgree ++;
			q = (G_v*)malloc(sizeof(G_v));
			q->num = a;
			q->next = NULL;
			if(tmp == NULL)
			{
				P[i].next = q;
				tmp = P[i].next;
			}
			else
			{
				tmp->next = q;
				tmp = tmp->next;
			}
		}
		i ++;
	}
	count = 1;
	for(i = 1;i <= n;i ++)
	{
		if(P[i].InDgree == 0)
		{
			if(count++ == n)
			{
			   printf("%d\n",i);
			   break;
			}
			else
				printf("%d ",i);
			tmp = P[i].next;
			while(tmp)
			{
				P[tmp->num].InDgree --;
				tmp = tmp->next;
			}
		    P[i].InDgree = 200;
			i = 0;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值