poj 3687 Labeling Balls【反向拓扑】
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 12246 | Accepted: 3508 |
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:
- No two balls share the same label.
- 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 这道题搜了下题解,大神的思路就是清新脱俗;附上自己的理解分析
There is a blank line before each test case. 这句话可把我坑死了 还以为每组测试数据前都要打印出一行空格,pe了好久
题意:输入n,m代表有n个数参加排序,接下来m行输入数据x ,y表示x要在y的前边,但是重量小的(即数字小的)要尽量放到前边;
题解:此题要用反向拓扑,正向是肯定不行的,如数据
5 3
1 4
4 2
3 5
正向的话输出结果为 3 1 5 2 4 显然不对,正确结果应该为 1 3 4 2 5 同时采用优先队列,重的最先输出,我们先将重的,赋给
最先出队的(因为设置的优先队列是大的先出队)这样就可以把轻的尽量留在最后(因为是要逆序,所以留到后边,输出时是在前边)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
int n,m;
int map[300][300];
int vis[300],a[300];
void getmap()
{
int i,j;
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
if(!map[b][a])
{
map[b][a]=1;
vis[a]++;
}
}
}
void tuopu()
{
int i,j,k,g=n;
k=0;
memset(a,0,sizeof(a));
priority_queue<int>q;
while(!q.empty())
q.pop();
for(i=1;i<=n;i++)
if(!vis[i])
q.push(i);
int u;
while(!q.empty())
{
u=q.top();
q.pop();
a[u]=g--;
for(i=1;i<=n;i++)
{
if(map[u][i])
{
vis[i]--;
if(vis[i]==0)
q.push(i);
}
}
}
if(g!=0)
printf("-1\n");
else
{
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
}
int main()
{
int t,o=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
getmap();
tuopu();
}
return 0;
}
poj 3687 Labeling Balls【反向拓扑】的更多相关文章
- poj 3687 Labeling Balls - 贪心 - 拓扑排序
Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N ...
- POJ 3687 Labeling Balls【拓扑排序 优先队列】
题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...
- POJ 3687 Labeling Balls(拓扑排序)题解
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
- POJ - 3687 Labeling Balls (拓扑)
(点击此处查看原题) 题意 此处有n盏灯,编号为1~n,每盏灯的亮度都是唯一的,且在1~n范围之间,现已知m对灯之间的关系:a b ,说明灯a的亮度比灯b小,求出每盏灯的亮度,要求字典序最小(编号小的 ...
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16100 Accepted: 4726 D ...
- poj——3687 Labeling Balls
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14835 Accepted: 4346 D ...
- POJ 3687 Labeling Balls()
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9641 Accepted: 2636 Descri ...
- POJ 3687 Labeling Balls (top 排序)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15792 Accepted: 4630 D ...
随机推荐
- iOS textfield实现一行的数字限制,超出进行弹框
步骤一:添加textfield协议‘ @interface LsGeXingQianMingVC ()<UITextFieldDelegate> 步骤2:设置代理 _GeXingQianM ...
- 动效解析工厂:Mask 动画
转载自:http://www.cocoachina.com/ios/20160214/15250.html 前言:很多动效都是多种动画的组合,有时候你可能只是需要其中某个动画,但面对庞杂的代码库或是教 ...
- BestCoder Round #85 sum
大晚上的更一道下午的水题吧.(虽然WA了好多次= =,但真实情况是我比较水) 描述 Given a sequence, you're asked whether there exists a cons ...
- 237. Delete Node in a Linked List(C++)
237. Delete Node in a Linked Lis t Write a function to delete a node (except the tail) in a singly l ...
- 读书笔记之 - javascript 设计模式 - 观察者模式
在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式是一种管理人与其任务(确切的讲,是对象及其行为和状态之间的关系)之间的关系的得力工具.用javascript的话来讲,这种模式的实 ...
- "The request sent by the client was syntactically incorrect ()"问题定位及解决:
Spring MVC "The request sent by the client was syntactically incorrect ()"解决办法: 把spring日志级 ...
- 百度劫持js代码
js代码为: var myDate=new Date(); //返回一日期对象,可以调用getDate(),内容为当前时间,这句是新建一个对象d建好对象后d就有函数date()中的所有特性 var h ...
- Discuz论坛下载与安装
Part1 Discuz下载 百度“discuz下载” 2. 找到下图这里 3. 选择你需要的版本,这里我选了X3.1版 4. 选择UTF-8简体下载 这是我下载好的文件 Part2 Discuz安装 ...
- Activity生命周期回顾
先来一张经典的生命周期图: ------------------------------------------------------------- 工程代码: ActivityLifeCycle. ...
- 简单学C——第五天
结构体 首先明确,结构体是一种构造的数据类型,是一种由多个数据类型如 int,char,double,数组或者结构体......组成的类型,现在告诉大家如何定义一个结构体.在定义int整型变量时,大家 ...