http://poj.org/problem?id=3687

题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签。如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的前面比后的要请,而且这n个球的重量也正好是分布在1-n这个范围内,现在要你求出他们各自所占的重量。

思路:最开始,我也是想到了用拓扑排序,但是它的入度值我确定不了,然后去看discuss,里面说对每个判断条件反向建图,然后在用最大优先队列。我不理解这是什么意思。然后看了下别人的博客,模拟了一下大概的过程。

比如说

4 1

4 1

那么答案是2 3 4 1

反向建图,那么也就是digree[ 4 ] ++;

然后,其他的数入度值都是为0,所以都进优先队列。

那么现在优先队列就是有 1 2 3 这三个数。

然后,location[ 3 ] = 4;

再去寻找有没有与3相比较过的数。

然后, location[ 2 ] = 3;

再去找有没有与2相比较过的数。

然后,location[ 1 ] = 2;

再去找有没有与1比较过的数,如果有的话,把那么数入队列,那么4就入了队列。

然后,location[ 4 ] = 1;

然后反向输出,这就是结果,而那么 4 3 2 1 这是怎么来的呢,首先用一个变量num等于n。

然后每使用一次,这个变量就--。上面的也就是相当于 location[ 3 ] = 4 --。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 #define maxn 210
 5
 6 using namespace std;
 7
 8 int digree [ maxn ];        //这个就是入度值。
 9 int judge [ maxn ][ maxn ];     //这个是用来判断有没有重边的。
10 int location [ maxn ];
11 int m,n;
12
13 priority_queue<int >s;     //这个是默认的最大优先队列。
14
15 int topsort()
16 {
17     int num = n;
18     for( int i = 1 ; i <= n ; i++ )
19         if(!digree[ i ]) s.push( i );
20     if( s.empty() )  return 0;    //如果没有入度为0的,则说明构成了一个环。
21     while( !s.empty() )
22     {
23         int tmp =s.top();
24         s.pop();
25         location [ tmp ] = num--;
26         for( int i = 1 ; i <= n ; i++ )
27         {
28             if( judge[ i ][ tmp ] )
29             {
30                 judge[ i ][ tmp ] = 0;
31                 digree[ i ] --;
32                 if( !digree[ i ] ) s.push( i );
33             }
34         }
35     }
36     if( num != 0 ) return 0;    //如果这里Num 不能等于0,那么说明最少还有两个是无法确定的。
37     return 1;
38 }
39
40
41 int main()
42 {
43     int t,a,b;
44     scanf("%d",&t);
45     while( t -- )
46     {
47         memset( digree , 0 , sizeof( digree ) );
48         memset( judge , 0 , sizeof( judge ) );
49         memset( location , 0 , sizeof( location ) );
50         scanf("%d%d",&n,&m);
51         for( int i = 1 ; i <= m ; i ++ )
52         {
53             scanf("%d%d",&a,&b);
54             if(judge[ a ][ b ] > 0) continue;   //判重。
55             judge[ a ][ b ] = 1;
56             digree [ a ] ++;
57         }
58         a = topsort();
59         if( a ) {
60             int i = 1;
61             for( ; i < n ; printf("%d ",location[ i++ ]) );
62             printf("%d\n",location[ i ]);
63         }
64
65         else printf("-1\n");
66     }
67     return 0;
68 }

转载于:https://www.cnblogs.com/Tree-dream/p/5748312.html

poj 3687(拓扑排序)相关推荐

  1. POJ 3687 拓扑排序

    一个比较慢的算法. 反向拓扑,从大到小枚举. #include <cstdio> #include <cstring> using namespace std; int cas ...

  2. poj 4084:拓扑排序

    poj 4084:拓扑排序 非常好的题目,恶心的算法 描写叙述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下.编号小的顶点在前. 输入 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接 ...

  3. Poj 1094 拓扑排序Kahn

    Poj 1094 拓扑排序Kahn Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4133 ...

  4. POJ 1094 拓扑排序

    题意大坑,建议先看Discuss-- 否则代码写得就像以下的一团糟.... 其实并不难,拓扑排序+乱搞就可以AC. // by SiriusRen #include <cstdio> #i ...

  5. 【题解】(图论) —— POJ 0719:拓扑排序

    题目链接:OpenJudge - 0719:拓扑排序 总时间限制: 10000ms 内存限制: 1000kB 描述 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前 输入 若干 ...

  6. [POJ] 3687 Labeling Balls(拓扑排序)

    题目地址:http://poj.org/problem?id=3687 反向建边,即重的球指向轻的球,注意重边,然后拓扑排序.从n-->1循环,即每次从入度为0的球里面选编号大的存(包含输入的逻 ...

  7. 拓扑排序 POJ - 3687反向图跑字典序(重边)

    题目链接:http://poj.org/problem?id=3687 题目大意: 给定N个球,这些球的编号分别是1-N中的某个数字,它们的重量也分别是1-N中的某个数字,任意两个球的编号和重量不相等 ...

  8. POJ 3687 Labeling Balls【拓扑排序】

    题意: 有 n 个球,想要对他们进行编号1..n,知道了一些求的轻重的关系,要求轻的球必须排在重的球之前,如果存在没有冲突的排序方法的话,输出字典序最小的排序方式. 分析: 没考虑重边,WA了N次!! ...

  9. 图论之拓扑排序 poj 2367 Genealogical tree

    题目链接 http://poj.org/problem?id=2367 题意就是给定一系列关系,按这些关系拓扑排序. #include<cstdio> #include<cstrin ...

最新文章

  1. 组件命名方式||局部组件注册:局部组件只能在注册他的父组件中使用
  2. 李永乐线性代数2020年基础课手写笔记汇总
  3. 安装mysql-connector-python-8.0.11-py3.6遇到问题
  4. 【JAVA 第四章 流程控制语句】课后习题 直线斜率 以及判断坐标是否在直线上点到直线的距离
  5. python的复数实部和虚部都是整数_Python(一)
  6. 2021年中国带锯机市场趋势报告、技术动态创新及2027年市场预测
  7. 构建指定仓库_使用Travis CI自动构建和部署你的GitBook
  8. 使用 typescript ,提升 vue 项目的开发体验(2)
  9. ValueError: output parameter for reduction operation logical_and has too many dimensions ?
  10. 【华为机试 Python实现】VLAN资源池
  11. windows错误代码一览表
  12. 美国弗吉尼亚大学计算机科学,2017美国弗吉尼亚大学计算机科学专业
  13. 67.Python修炼之路【72-前端-HTML列表】2018.06.28
  14. 10005---数据采集与埋点
  15. uedit 富文本编辑器 图片上传 图片服务器
  16. python 自动播放_在IPython noteb中自动播放声音
  17. Spring Boot 错题本
  18. HWND CDC HDC的转换
  19. 【小白篇】从零开始搭建传奇服务器(只做自我娱乐之用)
  20. 虚树学习笔记(洛谷2495 消耗战)

热门文章

  1. TI C2000 刷flash意外锁芯片的解决办法
  2. 复旦计算机教师,复旦教师:我有无人能及的相声天赋
  3. 计算机网速单位是什么,计算机存储单位和网络网速单位
  4. phpwind mysql 密码_PhpWind教程:MySQL数据库密码修改方法
  5. python下载arcgis地图_使用下载器下载适用于arcgis的离线地图切片
  6. 第七届科技节获奖及建模论文相似度名单公示
  7. 基于 MATLAB fitcsvm 的 OVR SVM 多分类器实现
  8. HTML5中图片路径的几种使用方式
  9. EXCEL查找字符串里是不是存在某个字符,并对存在的字符进行操作 if find
  10. POJ Haybale Guessing