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 --。

 #include <stdio.h>
#include <string.h>
#include <queue>
#define maxn 210 using namespace std; int digree [ maxn ]; //这个就是入度值。
int judge [ maxn ][ maxn ]; //这个是用来判断有没有重边的。
int location [ maxn ];
int m,n; priority_queue<int >s; //这个是默认的最大优先队列。 int topsort()
{
int num = n;
for( int i = ; i <= n ; i++ )
if(!digree[ i ]) s.push( i );
if( s.empty() ) return ; //如果没有入度为0的,则说明构成了一个环。
while( !s.empty() )
{
int tmp =s.top();
s.pop();
location [ tmp ] = num--;
for( int i = ; i <= n ; i++ )
{
if( judge[ i ][ tmp ] )
{
judge[ i ][ tmp ] = ;
digree[ i ] --;
if( !digree[ i ] ) s.push( i );
}
}
}
if( num != ) return ; //如果这里Num 不能等于0,那么说明最少还有两个是无法确定的。
return ;
} int main()
{
int t,a,b;
scanf("%d",&t);
while( t -- )
{
memset( digree , , sizeof( digree ) );
memset( judge , , sizeof( judge ) );
memset( location , , sizeof( location ) );
scanf("%d%d",&n,&m);
for( int i = ; i <= m ; i ++ )
{
scanf("%d%d",&a,&b);
if(judge[ a ][ b ] > ) continue; //判重。
judge[ a ][ b ] = ;
digree [ a ] ++;
}
a = topsort();
if( a ) {
int i = ;
for( ; i < n ; printf("%d ",location[ i++ ]) );
printf("%d\n",location[ i ]);
} else printf("-1\n");
}
return ;
}

最新文章

  1. javascript鸭式辩型法实现接口
  2. Matlab 运行C程序出现的编译出错问题
  3. oracle分层查询中的start with和connect by(树结构查询)
  4. springmvc学习笔记--Interceptor机制和实践
  5. ios_图片放大的两种方式transform和frame
  6. RMAN_Oracle RMAN的常用Command命令
  7. UVa 12096 The SetStack Computer【STL】
  8. bzoj2588
  9. NCPC 2015 - Problem A - Adjoin the Networks
  10. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
  11. TextureView+SurfaceTexture+OpenGL ES来播放视频(二)
  12. 锋利的jQuery事件
  13. MySQL元数据库——information_schema
  14. Java开发快速上手
  15. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-3项目架构说明
  16. SqlExcel使用文档及源码
  17. 杭电OJ之2020-2029(C语言版)
  18. RabbitMQ入门:工作队列(Work Queue)
  19. ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)
  20. php备注

热门文章

  1. Mac下打开eclipse 始终提示 你需要安装Java SE 6 Runtime
  2. 聊聊 Web 项目二维码生成的最佳姿势
  3. C#进阶系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程)
  4. C#进阶系列——动态Lamada(二:优化)
  5. 对.net技术组件的分析和选择
  6. 作业一:android开发平台的演变以及Android Studio设置
  7. android多线程断点续传下载文件
  8. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
  9. vue.js之绑定class和style
  10. SVN随记