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 ...
随机推荐
- [CentOS]添加删除用户
摘要 在安装CentOS的时候,我们只设置了root,类似windows的超级管理员.当然我们在工作的时候,为了安全考虑,不可能对外开发root,一方面是从安全的角度,另一方面也是方便管理. 添加删除 ...
- html中的 button,input-button, image, input-image的区别
hmtl中 为了验证 form的 action提交属性, 是指 表单提交到的 页面, 可以是任意 性质的页面, 如:html页面, php页面, asp页面等都可以, 实际在测试的时候, 可以就写 提 ...
- SQL语句学习笔记
从外部EXCEl文件导入sqlserver数据库操作命令 reconfigure reconfigure go select * into abc1_1 from OPENROWSET('MICROS ...
- jQuery1.9.1源码分析--数据缓存Data模块
jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...
- 懒加载的用处和赋nil操作[iOS开发教程]
懒加载的用处和赋nil操作 1:数据,清空操作: self.array = nil; 2:归档从新从本地获取数据 self.archive = nil; ##id = nil的用处 block当参数, ...
- C# 中excel操作
c#中设置Excel单元格格式 1.全表自动列宽 mysheet.Cells.Select(); mysheet.Cells.Columns.AutoFit(); 2.合并 excelRa ...
- 关于外部引用JS,中文乱码的问题
asp.net 页面默认编码为UTF-8, 如果js嵌套写在asp.net中,不会导致中文乱码,因为他们具有相同的编码 外部引用js由于编码格式与asp.net的编码不同,javascript编码默认 ...
- 大数据之pig安装
大数据之pig安装 1.下载 pig download 2. 解压安装 mapreduce模式安装: 1:设置HADOOP_HOME,如果pig所在节点不是集群中的节点,那就需要把集群中使用的hado ...
- Eclipse中集成Ant配置 (转)
目前的Eclipse都集成了ant,本文图示如何在eclipse下使用ant. 1.新建Java Project-新建Java文件HelloWorld.java HelloWorld.java pac ...
- hash-1.hash表和hash算法
1.hash表 哈希表,也叫散列表,是根据关键码(Key)而直接访问的数据结构,也就是它把Key映射到表中一个位置来访问记录,即,把key计算成hashcode,把hashcode存到表中.这个把ke ...