关闭

poj-3687Labeling Balls(反向建图+优先队列+逆向输出)

标签: poj3687Labeling Balls反向建图+优先队列+逆向输出
503人阅读 评论(0) 收藏 举报
分类:

Labeling Balls
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12675   Accepted: 3647

Description

Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that:

  1. No two balls share the same label.
  2. The labeling satisfies several constrains like "The ball labeled with a is lighter than the one labeled with b".

Can you help windy to find a solution?

Input

The first line of input is the number of test case. The first line of each test case contains two integers, N (1 ≤ N ≤ 200) and M (0 ≤ M ≤ 40,000). The next M line each contain two integers a and b indicating the ball labeled with a must be lighter than the one labeled with b. (1 ≤ a, b ≤ N) There is a blank line before each test case.

Output

For each test case output on a single line the balls' weights from label 1 to label N. If several solutions exist, you should output the one with the smallest weight for label 1, then with the smallest weight for label 2, then with the smallest weight for label 3 and so on... If no solution exists, output -1 instead.

Sample Input

5

4 0

4 1
1 1

4 2
1 2
2 1

4 1
2 1

4 1
3 2

Sample Output

1 2 3 4
-1
-1
2 1 3 4
1 3 2 4



这个题和逃生那个题是一类的,都是要尽量把小的往前排,所以要反向建图,如果用到邻接表的话,就还要用到优先队列


我用了两种方法


1,用到邻接表(反向拓扑+优先队列+逆向输出)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int head[500],degree[500],result[450],m,n,t;
struct node {
	int to,next;
}s[400000];
void add(int x,int y)
{
	s[t].to=y;
	s[t].next=head[x];
	head[x]=t++;
}
int topo()
{
	int i,j,p;
	priority_queue<int >Q;
	for(i=1;i<=m;i++)
	if(degree[i]==0)
	Q.push(i);
	p=m;
	while(!Q.empty())
	{
		int w=Q.top();
		Q.pop();
		result[w]=p--;
		
		for(int k=head[w];k!=-1;k=s[k].next)
		{
			int e=s[k].to;
			degree[e]--;
			
			if(!degree[e])
			Q.push(e);
		}
	}
	if(p==0)
	return 1;
	
	return 0;
}
int main()
{
	int N,a,b,i,j;
	scanf("%d",&N);
	while(N--)
	{
		t=0;
		memset(degree,0,sizeof(degree));
		memset(head,-1,sizeof(head));
		scanf("%d%d",&m,&n);
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			add(b,a);
			degree[a]++;
		}
		int qw=topo();
		if(qw)
		{
			for(i=1;i<m;i++)
			printf("%d ",result[i]);
			printf("%d\n",result[i]);
		}
		else
		printf("-1\n");
	}
	return 0;
}


2,反向建图,正向输出


#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int map[500][500],degree[500],m,n;
void topo()
{
	int i,j,a,result[500],t=0,mark;
	for(i=m;i>0;i--)
	{
	    mark=-1;
		for(j=m;j>=1;j--)
		{
			if(degree[j]==0)
			{
				mark=j;
				break;
			}
		}
		if(mark==-1)
		break;
		degree[mark]=-1;
		result[j]=i;
		for(int k=1;k<=m;k++)
		{
			if(map[mark][k])
			degree[k]--;
		}
	}
	if(mark==-1)
	printf("-1\n");
	else
	{
		for(i=1;i<m;i++)
		printf("%d ",result[i]);
		printf("%d\n",result[i]);
	}
}
int main()
{
	int N,i,j,a,b;
	scanf("%d",&N);
	while(N--)
	{
		memset(map,0,sizeof(map));
		memset(degree,0,sizeof(degree));
		scanf("%d%d",&m,&n);
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&a,&b);
			if(!map[b][a])
			{
				map[b][a]=1;
				degree[a]++;
			}
		}
		topo();
	}
	return 0;
}



0
0
查看评论

Labeling Balls

Problem D:Labeling BallsTime Limit:1000MS  Memory Limit:65536KTotal Submit:12 Accepted:5 Description Windy has N balls of distinct weights from 1...
  • abcjennifer
  • abcjennifer
  • 2010-03-23 19:37
  • 2475

POJ-3687 Labeling Balls

Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in s...
  • Snow_Me
  • Snow_Me
  • 2016-07-25 20:20
  • 190

有向图邻接表表示及反向图构造(第五周作业)

作业基本
  • longshanaa
  • longshanaa
  • 2014-04-17 21:46
  • 970

HDOJ4857 反向建图+优先队列

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5725  ...
  • computer_user
  • computer_user
  • 2017-08-30 09:03
  • 74

字符串逆向输出

1、思路:将字符串转化为字符串数组,然后根据下标反向输出 public void reverse() { String s = "hello"; char[] c; ...
  • u011195535
  • u011195535
  • 2016-05-28 14:32
  • 1716

逆向输出链表

在不改变链表结构的前提下,使用一个后进先出的数据结构(栈)存储正向遍历链表的结果,根据后进先出的特点:最后一个进入的数据最先被弹出,可以逆向打印出链表。我们也可以根据递归来逆向输出链表。#include #include using namespace std; //链表的节点类型 struct ...
  • yang20141109
  • yang20141109
  • 2015-10-16 20:34
  • 1163

POJ:3687 Labeling Balls (反向建图+拓扑排序+优先队列)

题意:给定n个球和m条球与球之间的轻重关系,要求输出每个球的重量,无解则输出-1. trick:1.有重边。             2.要求输出每个球的重量而不是从轻到重每个球的标签。 &...
  • kkkwjx
  • kkkwjx
  • 2013-09-30 22:36
  • 738

Poj 3687 Labeling Balls【逆向建图+拓扑排序+优先队列+思维】

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13273   Acc...
  • mengxiang000000
  • mengxiang000000
  • 2016-06-13 16:52
  • 256

POJ 3687 Labeling Balls(拓扑排序【反向建图+优先队列】)

Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12426   Accepted: 3570 ...
  • zwj1452267376
  • zwj1452267376
  • 2015-09-18 18:54
  • 311

POJ Silver Cow Party (最短路+反向建图)

题目链接:POJ Silver Cow Party 题意:
  • u012377575
  • u012377575
  • 2014-07-23 11:05
  • 648
    个人资料
    • 访问:91278次
    • 积分:2281
    • 等级:
    • 排名:第19446名
    • 原创:218篇
    • 转载:3篇
    • 译文:0篇
    • 评论:7条
    最新评论