Labeling Balls
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 16100   Accepted: 4726

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, bN) 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

Source

 
 

题目意思:
给你n个球和m组关系,关系a b表示a比b轻,在符合这些要求的条件下,给他们贴标签
要求轻的球标签也要小,最后要你输出这些球的重量顺序

第一次的做法:
一开始的思路是用一个优先队列,从而做到从小到大取标签,
保证标签号小的在序列的尽可能前面,这样对于比较小的标签,
就可以得到比较小的重量了。
然后妥妥的wa
因为我输出的整个标签的序列而不是每个标签所对应的球的重量。
改完以后交了,还是错,想了好久,
看了别人的思路都说这道题要反向建图,
在从大往小的取,将大的数尽量放到答案的后面,
这样就能够保证小重量的球尽可能的放到了前面。

题目意思一开始就看错了两个地方
1.要求输出的不是标签顺序,而是重量的顺序
2.没有理解轻的球其标签也要小

正解:
分析;
给了你m组关系,a b表示标签为a比标签为b轻
我们可以先得到标签的顺序,然后再变化一下得到每个标签对应的重量

求标签的顺序:
要使得轻的球其标签小,也就是轻的放标签序列的前面
如果按照我一开始的做法,正向拓扑,然后每次选标签小的放前面
这样是不行的,因为即使该点最小,但是它后面连接的点未必是最小的啊
比如:
6->4->1
              \
3->9->2 ->0
               /
5->7->8

1,2,8都是指向0的,不好画

如果取入度为0且最小的话,那么是先取3,而我们的目的是让标号小的尽量靠前,即让1靠前,这与先取3是相违背的
所以我一开始的做法的确不行

因为题目是要满足轻的球标签小,所以正确做法:
每次让标签号大的尽量完后排,因为从后往前看,位置是越来越重要的!
贪心的思想
所以我们反向建边就是b比a重,每次选择标签号大的从最后面开始
因为越到前面,是越来越重要的,我们先从不重要的开始放,最后再放最重要的(同时最后放的也是在满足约束的条件下,标签号最小的)
样例:
5 3
1 4
4 2
3 5

反向建图:
2->4->1
5->3

每次选择标签号大的排(从后往前排)
那么拓扑得到的标签顺序就是:1 4 2 3 5
再求其重量排序:(重量为2的排在第3个,重量为3的排在第四个)
1 3 4 2 5

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
} #define max_v 205
int indgree[max_v];
vector<int> vv[max_v];
priority_queue<int,vector<int>,less<int> > q;
int n,m;
int a[max_v];
int tpsort()
{
for(int i=;i<=n;i++)
{
if(indgree[i]==)
q.push(i);
}
int temp;
int cnt=;
int k=n;
while(!q.empty())
{
temp=q.top();
q.pop();
a[temp]=k--;
cnt++;
for(int i=;i<vv[temp].size();i++)
{
indgree[vv[temp][i]]--;
if(indgree[vv[temp][i]]==)
q.push(vv[temp][i]);
}
}
if(cnt!=n)
return ;
else
return ;
}
int main()
{
int t;
int x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
if(m==)
{
for(int i=;i<=n;i++)
{
if(i==)
printf("%d",i);
else
printf(" %d",i);
}
printf("\n");
continue;
}
memset(indgree,,sizeof(indgree));
for(int i=;i<=n;i++)
vv[i].clear();
while(!q.empty())
q.pop();
int flag1=;//环
for(int i=;i<=m;i++)
{
scanf("%d %d",&y,&x);
if(flag1==)
{
if(x==y)
{
flag1=;
continue;
}
if(count(vv[x].begin(),vv[x].end(),y)==)
{
vv[x].push_back(y);
indgree[y]++;
}
}
}
if(flag1==)
flag1=tpsort();
if(flag1)
{
printf("-1\n");
continue;
}
for(int i=;i<=n;i++)
{
if(i==)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
printf("\n");
}
return ;
} /*
题目意思:
给你n个球和m组关系,关系a b表示a比b轻,在符合这些要求的条件下,给他们贴标签
要求轻的球标签也要小,最后要你输出这些球的重量顺序 第一次的做法:
一开始的思路是用一个优先队列,从而做到从小到大取标签,
保证标签号小的在序列的尽可能前面,这样对于比较小的标签,
就可以得到比较小的重量了。
然后妥妥的wa
因为我输出的整个标签的序列而不是每个标签所对应的球的重量。
改完以后交了,还是错,想了好久,
看了别人的思路都说这道题要反向建图,
在从大往小的取,将大的数尽量放到答案的后面,
这样就能够保证小重量的球尽可能的放到了前面。 题目意思一开始就看错了两个地方
1.要求输出的不是标签顺序,而是重量的顺序
2.没有理解轻的球其标签也要小 正解:
分析;
给了你m组关系,a b表示标签为a比标签为b轻
我们可以先得到标签的顺序,然后再变化一下得到每个标签对应的重量 求标签的顺序:
要使得轻的球其标签小,也就是轻的放标签序列的前面
如果按照我一开始的做法,正向拓扑,然后每次选标签小的放前面
这样是不行的,因为即使该点最小,但是它后面连接的点未必是最小的啊
比如:
6->4->1
\
3->9->2 -0
/
5->7->8 1,2,8都是指向0的,不好画 如果取入度为0且最小的话,那么是先取3,而我们的目的是让标号小的尽量靠前,即让1靠前,这与先取3是相违背的
所以我一开始的做法的确不行 因为题目是要满足轻的球标签小,所以正确做法:
每次让标签号大的尽量完后排,因为从后往前看,位置是越来越重要的!
贪心的思想
所以我们反向建边就是b比a重,每次选择标签号大的从最后面开始
因为越到前面,是越来越重要的,我们先从不重要的开始放,最后再放最重要的(同时最后放的也是在满足约束的条件下,标签号最小的)
样例:
5 3
1 4
4 2
3 5 反向建图:
2->4->1
5->3 每次选择标签号大的排(从后往前排)
那么拓扑得到的标签顺序就是:1 4 2 3 5
再求其重量排序:(重量为2的排在第3个,重量为3的排在第四个)
1 3 4 2 5
*/
 

POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)的更多相关文章

  1. POJ 3687 Labeling Balls【拓扑排序 优先队列】

    题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...

  2. POJ 3687 Labeling Balls(拓扑排序)题解

    Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...

  3. POJ - 3687 Labeling Balls (拓扑)

    (点击此处查看原题) 题意 此处有n盏灯,编号为1~n,每盏灯的亮度都是唯一的,且在1~n范围之间,现已知m对灯之间的关系:a b ,说明灯a的亮度比灯b小,求出每盏灯的亮度,要求字典序最小(编号小的 ...

  4. [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10161   Accepted: 2810 D ...

  5. poj 3687 Labeling Balls【反向拓扑】

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12246   Accepted: 3508 D ...

  6. poj——3687 Labeling Balls

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14835   Accepted: 4346 D ...

  7. POJ 3687 Labeling Balls()

    Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9641 Accepted: 2636 Descri ...

  8. POJ 3687 Labeling Balls (top 排序)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15792   Accepted: 4630 D ...

  9. 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 ...

随机推荐

  1. django rest_framework Serializers 序列化组件

    为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...

  2. jquery插件-fullpage.js

    1⃣️ 简介 fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站,主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 ...

  3. Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建

    前言: 最近在考虑搭建个人网站,想了想决定采用前后端分离模式 前端使用Vue,负责接收数据 后端使用Spring Boot,负责提供前端需要的API 就这样开启了我边学习边实践之旅 Vue环境搭建步骤 ...

  4. MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...

  5. 安卓基础之Activity的生命周期

    Activity的生命周期 onCreate 在Activity被创建时调用 onDesdroty 在Activity销毁时调用 onRestart 在Activity重新打开时调用 onStart ...

  6. Git 命令快速浏览

    Git 命令快速浏览 创建 Git 可管理的仓库 git init 查看当前仓库的状态 git status 添加到仓库,实际上是添加到暂存区 git add [-A | --all] git add ...

  7. 设置联想键盘恢复F1~F12默认按键的操作办法

    背景 默认都是笔记本键盘才有Fn组合功能键,台式机很少有.今天领到的是联想键盘,给我的台式机使用后F12很麻烦,必须Fn+F12才可以. 需求 恢复默认的F1~F12功能 方案 只需要下载驱动安装: ...

  8. Eclipse中Tomcat的配置

    1.Window-Preferences-Server-Runtime Environments 2.点击Add,选择相应的Tomcat版本,我的是7.0的所以我选择这个.并勾选Create a ne ...

  9. NoSQL数据库的认识

    SQL数据库和NoSQL数据库介绍 什么是SQL数据库? 关系型数据库是依据关系模型来创建的数据库.而所谓的关系模型就是“一对一.一对多.多对多”等关系模型,这是一种二维表格模型,因此一个关系型数据库 ...

  10. MYSQL导入csv类型的数据出现The MySQL server is running with the --secure-file-priv option

    今天尝试使用 into outfile导出数据的时候出现错误: The MySQL server is running with the --secure-file-priv option so it ...