POJ 3687 Labeling Balls (反向拓扑排序)

#include <stdio.h>
#define MAX_LABEL 200
#define MAX_WEIGHT 200
#define MAX_CONSTAINS 40000

int numOfBalls, numOfConstrains;
int maxLabel, maxWeight;
int lighter, heavier;
int fail;
int label, weight;
int weightOfBall;
int hasConstrain[MAX_LABEL + 1][MAX_LABEL + 1];
int inDegree[MAX_LABEL + 1];
int visited[MAX_LABEL + 1];
int labelOfBall[MAX_WEIGHT + 1];

int main(){

	int testCases;
	scanf("%d", &testCases);
	while (testCases--){
		scanf("%d%d", &numOfBalls, &numOfConstrains);

		maxLabel = numOfBalls;
		maxWeight = numOfBalls;

		for (lighter = 1; lighter <= maxLabel; lighter++){
			visited[lighter] = 0;
			inDegree[lighter] = 0;
			for (heavier = 1; heavier <= maxLabel; heavier++)
				hasConstrain[lighter][heavier] = 0;
		}

		int i;
		for (i = 1; i <= numOfConstrains; i++){
			scanf("%d%d", &lighter, &heavier);
			if (hasConstrain[lighter][heavier] == 0){
				hasConstrain[lighter][heavier] = 1;
				inDegree[lighter]++;
			}
		}

		fail = 0;
		for (label = maxLabel; label > 0; label--){
			weightOfBall = 0;
			for (weight = maxWeight; weight > 0; weight--)
				if (visited[weight] == 0 && inDegree[weight] == 0){
					weightOfBall = weight;
					break;
				}

			if (weightOfBall == 0){
				fail = 1;
				break;
			}
			visited[weightOfBall] = 1;
			labelOfBall[weightOfBall] = label;

			for (lighter = 1; lighter <= maxLabel; lighter++)
				if (hasConstrain[lighter][weightOfBall])
					inDegree[lighter]--;
		}

		if (fail)
			printf("-1\n");
	    else {
			for (weight = 1; weight <= maxWeight; weight++)
				printf("%d ", labelOfBall[weight]);
			printf("\n");
		}
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值