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 ...
随机推荐
- 使用HttpFileServer自建下载服务器
如今单位办公离不开电脑,使用电脑离不开资料传输,举一个简单的例子吧,很多用户经常在电脑上编辑文件,这些文件往往打印出来给领导审阅,可是你电脑上没有打印机,这时你会想到通过优盘.网络硬盘.邮箱.QQ等方 ...
- webapp开发要点记录
1. iphone 各机型 机型 分辨率 像素比 物理分辨率 高* 宽 * 后 主屏对角线长度 重量 像素密度(ppi) iphone4/iphone4s 320 * 480 2 640 * 960 ...
- Oracle11安装
图片上传失败,重新编辑 1.选择安装目录,一般设置数据库口令为system 2.环境检查 3.注册页面,直接下一步 4.点击安装按钮 5.进入安装界面 6.等待 7.直到出现下面界面,点击口令管理 8 ...
- Android 4.4以上的存储读写权限
最近遇到一个奇怪现象,直接往Android的SD卡根目录写入文件,报异常:open failed EACCES:permission denied. 已经在manifest.xml中加入android ...
- Inno Setup制作应用程序安装包
我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开.原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dl ...
- linux 驱动 工作队列
http://blog.sina.com.cn/s/blog_78d30f6b0102uyaf.html http://blog.csdn.net/lyc_stronger/article/detai ...
- Java VisualVM使用:堆OOM
背景 近期遇到了一个java.lang.OutOfMemoryError: Java heap space的问题,排除了堆设置过小的问题,代码走查没有头绪,所以使用VisualVM工具分析堆内存情况. ...
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- iOS开发——源代码管理——svn 命令行下常用的几个命令
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domai ...
- SSH如何通过公钥连接云服务器
导读 通常我们连接远程服务器(linux)windows下通过putty或xshell等工具远程连接.linux下可以直接通过ssh命令连接.其实这两者都是一致的,都是通过ssh协议进行传输. 如果我 ...