博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3687 Labeling Balls(拓扑排序)
阅读量:5058 次
发布时间:2019-06-12

本文共 1613 字,大约阅读时间需要 5 分钟。

题意:

标号为 1~n 的 N 个球,满足给定的 M 个编号约束关系,输出最终满足关系的球的标号。

思路:

1. 相互之间有一定的约束关系,会联系到拓扑排序,如果利用拓扑排序去解决本题还需要一定的贪心思想;

2. 因为要保证标号小的球靠前的优先级越高,所以对于正向图拓扑排序,无法满足,比如:<1, 4> <4, 2> <3, 5>

3. 对于反向拓扑排序,用同样的方法只需要保证标号大的球尽量靠后就行了,具体见代码。

 

#include 
#include
#include
using namespace std;const int MAXN = 210;vector
G[MAXN];int arr[MAXN], indeg[MAXN];bool judge(int u, int v) {
for (int i = 0; i < G[u].size(); i++) if (G[u][i] == v) return false; return true;}int main() {
int cases; scanf("%d", &cases); while (cases--) {
int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) G[i].clear(), indeg[i] = 0; while (m--) {
int u, v; scanf("%d%d", &v, &u); if (judge(u, v)) {
G[u].push_back(v); indeg[v] += 1; } } int w; for (w = n; w >= 1; w--) {
int i; for (i = n; i >= 1; i--) if (!indeg[i]) break; if (i == 0) break; arr[i] = w; indeg[i] = -1; for (int j = 0; j < G[i].size(); j++) {
int v = G[i][j]; if (indeg[v] > 0) indeg[v] -= 1; } } if (w != 0) printf("-1\n"); else {
for (int i = 1; i <= n; i++) printf("%d ", arr[i]); printf("\n"); } } return 0;}

转载于:https://www.cnblogs.com/kedebug/archive/2013/05/12/3074122.html

你可能感兴趣的文章
Windows Phone Marketplace 发布软件全攻略
查看>>
Unity3D研究院之打开Activity与调用JAVA代码传递参数(十八)【转】
查看>>
语义web基础知识学习
查看>>
hexo个人博客添加宠物/鼠标点击效果/博客管理
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
关于WPF的2000件事 02--WPF界面是如何渲染的?
查看>>
单元测试、、、
查看>>
深入理解include预编译原理
查看>>
SVN使用教程总结
查看>>
JS 浏览器对象
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
虚拟中没有eth0
查看>>
Unity 3D游戏开发学习路线(方法篇)
查看>>
BZOJ2049[Sdoi2008]Cave 洞穴勘测(LCT模板)
查看>>
vuex插件
查看>>
2011年12月09日
查看>>
[ZJOI2007]棋盘制作 【最大同色矩形】
查看>>
合并单元格
查看>>
swift-初探webView与JS交互
查看>>