ACM/ICPC 之 拓扑排序-反向(POJ3687)
难点依旧是题意。。。。需要反向构图+去重+看题
POJ3687-Labeling Balls
题意:1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号最小的Ball重量最轻,若依旧多组则输出编号次小的Ball重量最轻的方案。
题解:在看懂题意后,再开始做会省很多时间。。。曲解题意还真是人类的本能啊。
为了完成单向关系排序,需要用到拓扑排序;
为了符合编号最小的重量最轻...的题意,需要用到反向拓扑排序;
输入可能会有重复的关系,因此需要判重;
输出需要按原编号输出其重量,因此需要在每个编号上标记其重量。
//给球编号
//1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号越小重量越轻的方案
//反向拓扑+去重+看题...(题意最后需要将Ball的重量按原编号输出)
//迭代器判重:Time:125Ms Memory:524K
//数组判重: Time:63Ms Memory:564K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std; #define MAX 205 struct Number {
vector<int> light;
int in; //in_degree
int weight; //该编号球的重量
}num[MAX]; int n, m;
bool v[MAX][MAX]; bool TopSort()
{
for (int t = n; t > ; t--) //最重到最轻
{
int cur = n + ;
while (--cur && num[cur].in); //将最大的label先取出放在最后
if (cur == ) return false; //有环 num[cur].weight = t; //记录重量
num[cur].in--;
for (unsigned j = ; j < num[cur].light.size(); j++)
num[num[cur].light[j]].in--;
}
return true;
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(num, , sizeof(num));
memset(v, false, sizeof(v));
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
{
int light, heavy;
scanf("%d%d", &light, &heavy);
//反向构图
//迭代器判重
//vector<int> lg = num[heavy].light;
//if (find(lg.begin(), lg.end(), light) != lg.end()) continue;
//数组判重
if (v[heavy][light]) continue;
v[heavy][light] = true;
num[heavy].light.push_back(light);
num[light].in++;
} if (TopSort())
{
for (int i = ; i < n; i++)
printf("%d ", num[i].weight);
printf("%d\n", num[n].weight);
}
else printf("-1\n"); } return ;
}
ACM/ICPC 之 拓扑排序-反向(POJ3687)的更多相关文章
- ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)
两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...
- ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)
两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...
- ACM: hihicoder #1174 : 拓扑排序·一 STL- queue
#1174 : 拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选 ...
- HDU2647(拓扑排序+反向建图)
题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,因为尽可能的让老板少付钱,那么a的工资就是b的工资+1.能够确定关系为a>b,依据拓扑排序建边的原则是把"小于" ...
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 两个很经典的拓扑排序题目POJ3687+HDU1285
一.题目链接 POJ:http://poj.org/problem?id=3687 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1285 二.思路 这两 ...
- HDU 2647 Reward 【拓扑排序反向建图+队列】
题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...
- 拓扑排序<反向拓扑+有向环的判断>
题目链接 #include <set> #include <map> #include <cmath> #include <queue> #includ ...
- hdu 4857 逆向拓扑排序+反向输出
/*一组测试实例 4 4 2 3 1 2 4 */ #include<stdio.h> #include<string.h> #include<queue> usi ...
随机推荐
- 给各位聚聚和大大介绍一个开源项目 Expression2Sql(转)
阅读目录 一.Expression2Sql介绍 二.单表简单查询 三.Where条件 四.多表关联查询 五.group by 六.order by 七.函数 八.delete 删除 九.update ...
- 请问如何查看mysql 的端口号?
mysql> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +--------- ...
- NetBeans如何关联两个项目
在实际工作中,有的项目需要关联其他项目 找到项目-->右键-->属性-->包含路径-->添加文件夹 添加你要的项目即可.
- c# List AddRange
https://msdn.microsoft.com/zh-cn/library/z883w3dc(v=vs.80).aspx List 中会保留集合中元素的顺序. 如果新的 Count(当前 Cou ...
- Backbone.js源码分析(珍藏版)
源码分析珍藏,方便下次阅读! // Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- SCP命令
\ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解 名称:cp 使用权限: ...
- linux查找某一进程并杀死
1. 查找redis进程 ps -ef|grep redis-server 2.打印第二个参数,因为上面第二列是进程号 3.这两个进程号有一个是grep进程号,所以要去掉,反选 grep ps ...
- 利用Jquery的load函数实现页面的动态加载
利用Jquery的load函数实现页面的动态加载 js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...
- H5案例分享:html5重力感应事件
html5重力感应事件 一.手机重力感应图形分析 1.设备围绕z轴的旋转角度为α,α角度的取值范围在[0,360). 设备在初始位置,与地球(XYZ)和身体(XYZ)某个位置对齐. 设备围绕z轴的旋转 ...