Labeling Balls

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:
No two balls share the same label.
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, b ≤ N) 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

题目大意:

    第一行输入N和M,N表示有N个小球,编号分别为1—N。M表示下面用M组数据(x,y)。

    数据(x,y)表示小球x比小球y轻。每个小球的重量都不同,且范围是[1,n]。

    输出为 编号1的小球的重量,编号2小球的重量。。。编号N小球的重量(且使编号小的小球尽量轻)。条件矛盾的话输出-1。

解题思路:

    错误思路:正向建图+拓扑排序+贪心查找最小的编号 在根据编号在拓扑数组中的位置输出。(正向的贪心不能完全保证序号小的节点尽量排在前面。??)

    eg:6→1→3←5←4←2

        1)查找到6和2 将2加入topo数组

        2)查找到6和4 将4加入topo数组

        3)查找到6和5 将5加入topo数组

        4)将6加入数组 将1加入数组 将3加入数组

        topo数组:2 4 5 6 1 3

        输出为:5 1 6 2 3 4

    正确思路:反向建图+拓扑排序(尽量保证编号大的小球先确定大的重量)

    eg:6→1→3←5←4←2  反向之后:6←1←3→5→4→2

        1)查找到3 将3加入topo数组

        2)查找到5 将5加入topo数组

        3)查找到4 将4加入topo数组

        4)将2加入数组 将1加入数组 将6加入数组

        topo数组:6 1 2 4 5 3

        输出为: 2 3 6 4 5 1

Code:

 #include<stdio.h>
#include<string>
#include<iostream>
#include<cstring>
#define MAXN 300
using namespace std;
int topo[MAXN+],map[MAXN+][MAXN+],dis[MAXN+];
bool vis[MAXN+];
int main()
{
int T,N,M;
cin>>T;
while (T--)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(topo,,sizeof(topo));
memset(map,,sizeof(map));
bool ok=;
cin>>N>>M;
int i,j;
for (i=; i<=M; i++)
{
int t1,t2;
cin>>t1>>t2;
if (!map[t2][t1]) dis[t1]++;
map[t2][t1]=;
}
for (i=N; i>=; i--)
{
for (j=N; j>=; j--)
if (!dis[j]&&!vis[j])
{
topo[i]=j;
vis[j]=;
break;
}
if (j==) ok=;
for (int k=; k<=N;k++)
if (map[j][k])
dis[k]--;
}
if (ok)
{
for (i=; i<=N; i++)
{
//printf("%d",topo[i]);
for (int j=; j<=N; j++)
{
if (topo[j]==i)
printf("%d",j);
}
if (i==N) printf("\n");
else printf(" ");
}
}
else printf("-1\n");
}
return ;
}

POJ3687——Labeling Balls(反向建图+拓扑排序)的更多相关文章

  1. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  2. HUD2647 Reward_反向建图拓扑排序

    HDU2647 Reward 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对 ...

  3. 逃生 HDU 4857(反向建图 + 拓扑排序)

    逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...

  4. BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序

    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...

  5. hdu 4857 逆向建图+拓扑排序 ***

    题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...

  6. POJ 3687 Labeling Balls 逆向建图,拓扑排序

    题目链接: http://poj.org/problem?id=3687 要逆向建图,输入的时候要判重边,找入度为0的点的时候要从大到小循环,尽量让编号大的先入栈,输出的时候注意按编号的顺序输出重量, ...

  7. poj 3683 2-sat建图+拓扑排序输出结果

    发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...

  8. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  9. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

随机推荐

  1. [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像

    问题描述: [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像 原因 ...

  2. DTCMS中文章增加tags标签和关键词时中文,替换为英文状态,

    DTCMS.Web\admin\article\article_edit.aspx 找到添加和修改的方法 model.tags = txtTags.Text.Trim()model.seo_keywo ...

  3. RequireJS的简单应用

    一.RequireJS的主要作用与优点 主要作用:js模块化.编写复用js代码 优点: 1.防止命名冲突 2.声明不同js文件之间的依赖 3.代码模块化 (1)一个文件一个模块:每个js文件应该只定义 ...

  4. 基于Golang的游戏服务器框架cellnet开发日记(二)

    看官们肯定还有大部分不是很熟悉Actor模型. 我这里基于Erlang, Skynet等语言和框架库来实战型解释下Actor模型.  Actor概念 Actor模型和OO类似, 都是符合人的思维模式进 ...

  5. css中overflow:hidden的属性 可能会导致js下拉菜单无法显示

    css中overflow:hidden属性导致ExtJS中无法显示下拉滚动条 overflow属性: visible 默认.内容不会被修剪,会呈现在元素之外. hidden 内容会被修剪,但是浏览器不 ...

  6. php + mysql + sphinx 的全文检索(2)

    简单 使用php api 去查询 sphinx 的索引数据 $sphinx = new SphinxClient();                 $sphinx->SetServer (  ...

  7. TextBox控件

    1.通过设置Multiline属性(bool)来控制文本框是否为多行显示 txt_Change.Location = , );//设置文本框位置 txt_Change.Multiline = true ...

  8. 2016 系统设计第一期 (档案一)MVC 引用 js css

    @Styles.Render("~/Bootstrap/css/bootstrap-theme.css") @Scripts.Render("~/jQuery/jquer ...

  9. POJ 2516 最小费用最大流

    每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...

  10. java和php实现RSA加密互通-b

    java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pe ...