先上题目:

4110: PE class

Submit your solution     Discuss this problem     Best solutions
 

Description

The dwarven kingdom and the giant countries classmates have PE class together.
The students' height from 1 cm to N cm,everyone's height is different from other's.
There are N students in total, and there are M pairs of relationship, such as (i, j)
said the student's height stand at position i is less than the one stand at position j.
Can you find each position of the height of students?

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 student's height stand at
position a must be less than the one stand at position b. (1 ≤ a, b ≤ N)
There is a blank line before each test case.

Output

For each test case output one line the students' heights from position 1 to position N.
If there are several solutions exist, you should output the one with the smallest height for label 1,
then with the smallest height for label 2, then with the smallest height for label 3 and so on...
If no solution exists, output one line,just a number -1. output a blank line after each test case

Sample Input

4

4 2
1 2
2 1 4 1
2 1 4 1
3 2 3 1
1 1

Sample Output

-1

2 1 3 4

1 3 2 4

-1

Source

ycg663@scuacm
Sichuan University Programming Contest 2012 Preliminary

  题意:有身高为1~n的n个人,每个人的身高都不一样,现在要这些人站成一列,给出一系列的关系(i,j)代表i位置的人要比j位置的人矮。现输出字典序最小的拓扑排序结果。

  这一题需要注意的地方是字典序最小,需要逆向构图(有(i,j)的关系,就要构造一条(j,i)的边)。

  为什么需要逆向构图?

  我的理解:字典序最小的逆否命题是除了遵守边的要求以外,还需要注意排在后面的数需要尽量大,所以我们可以在拓扑排序的时候每一次出来一个位置,就给它赋一个还没有用的最大值。

  为什么正向构图就不可以呢?

  先看一组数据

  4 2

  2 3

4 1

  如果按照正向构图,结果:4 1 2 3

  如果按照逆向构图,结果:1 3 2 4

  我的理解:并不一定所有的点都会被边连在一起,如果点被分成了几组的话,那么这几组的先后顺序就需要考虑了。就像上面的例子一组是2->3,另一组是4->1存在一组里面大位置在小位置前面,同时这个大位置比其他组的开头元素都要大,那就会得出错误的答案了(感觉这里说的还是不是很清楚)。

  感觉这就像需要贪心一样。但是这里在编号的时候因为它给了你限制条件位置编号大的尽量大(当然,这要先符合拓扑排序的要求),所以就需要逆向构图了。

  这一切的根本还是因为拓扑排序结果不唯一。

上代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define NUM 202
#define MAX 40002
using namespace std; int n,m; int e[NUM][NUM];
int tot[NUM];
int lo[NUM]; priority_queue<int,vector<int>,less<int> > p;
bool tp(){
int c=n;
int r=;
while(!p.empty()) p.pop();
for(int i=;i<=n;i++) if(tot[i]==) p.push(i);
while(!p.empty()){
int v=p.top();
lo[v]=c; c--;
r++;
p.pop();
for(int i=;i<=n;i++){
if(e[v][i]==){
tot[i]--;
if(tot[i]==){
p.push(i);
}
}
}
}
if(r<n) return ;
return ;
} int main()
{
int t,u,v;
bool f;
//freopen("data.txt","r",stdin);
scanf("%d",&t);
for(int z=;z<t;z++){
scanf("%d %d",&n,&m);
memset(e,,sizeof(e));
memset(tot,,sizeof(tot));
memset(lo,,sizeof(lo));
f=;
while(m--){
scanf("%d %d",&u,&v);
if(e[v][u]==){
if(u==v) f=;
e[v][u]=;
tot[u]++;
}
}
if(f || !tp()) printf("-1");
else{
for(int i=;i<=n;i++){
if(i!=) printf(" ");
printf("%d",lo[i]);
}
}
printf("\n\n");
}
return ;
}

4110

SCU - 4110 - PE class的更多相关文章

  1. PE Checksum Algorithm的较简实现

    这篇BLOG是我很早以前写的,因为现在搬移到CNBLOGS了,经过整理后重新发出来. 工作之前的几年一直都在搞计算机安全/病毒相关的东西(纯学习,不作恶),其中PE文件格式是必须知识.有些PE文件,比 ...

  2. 原创 C++应用程序在Windows下的编译、链接:第二部分COFF/PE文件结构

    2.1概述 在windows操作系统下,可执行文件的存储格式是PE格式:在Linux操作系统下,可执行文件的存储格式的WLF格式.它们都是COFF格式文件的变种,都是从COFF格式的文件演化而来的. ...

  3. 简单PE类代码

    三个文件分别是类定义文件pefile.h;类实现文件pefile.cpp;类调用文件petype.cpp. #ifndef PE_FILE_H #define PE_FILE_H #include & ...

  4. 获取pe文件的文件类型

    工程文件petype.cpp通过调用pefile类中的函数获取文件类型. 文件类型的判断通过5个监测点完成. 监测点1:dos头的e_magic 监测点2:nt头的Signature 监测点3:文件头 ...

  5. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  6. PE读写

    // 仿PE文件.cpp : Defines the entry point for the console application.// #include "stdafx.h"# ...

  7. PE文件格式(加密与解密3)(一)

    本次的了解主要讲解 PE的基本概念.MS-DOS文件头.PE文件头.区块.输入表.输出表等. 这里我将会结合一个简单的小程序来加深我对PE文件结构的了解. 使用学习工具:有StudyPE.LordPE ...

  8. 再探.NET的PE文件结构(安全篇)

    一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...

  9. 浅析MSIL中间语言——PE文件结构篇

    一.开篇 开篇我想讲一下于本文无关的话题,其实我很想美化一下自己博客园一直没时间弄,无意间找了博客园李宝亨的博客园里面有一篇分享自己主题的文章,我就将这个模板暂时用作我的blog主题,我要讲述一个关于 ...

随机推荐

  1. Sqlserver 数据库恢复常见错误及解决(网站转载 留着备用)

    数据库恢复常见错误及解决 2009-04-13 11:25 1145人阅读 评论(0) 收藏 举报 数据库databasesqlserverusermicrosoftsql server 在sqlSe ...

  2. linux更换阿里云的源的shell脚本

    #!/bin/bash##########################################Function: update source#Usage: bash update_sour ...

  3. [Apple开发者帐户帮助]三、创建证书(5)创建WatchKit服务证书

    WatchKit服务证书允许您使用Apple推送通知(APN)将更新推送到Apple Watch上的复杂功能. 所需角色:帐户持有人或管理员. 在证书,标识符和配置文件中,从左侧的弹出菜单中选择iOS ...

  4. [Apple开发者帐户帮助]一、开始(2)登录您的开发者帐户

    使用Apple ID登录您的开发者帐户.如果您注册了付费程序(Apple Developer Program或Apple Developer Enterprise Program),请使用您用于注册的 ...

  5. 模拟Queue(wait/notify)

    BlockingQueue:顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据.我们要实现LinkedBlockingQueue下面的两个方法put和take. put(anObje ...

  6. HTML 打印 换页

    打印 HTML 无法强制换页其实是一件很令人困扰的事,要达到这个功能其实可以透过 CSS 的 Pagebreak 来处理. 强制分页有大概只有二种用的到: { page-break-after: al ...

  7. MVC微信浏览器图片上传(img转Base64)

    因公司业务需要,需要做一个微信公众号里的图片上传功能,主要用到的技术就是 img转base64 上到服务器 话不多说, 贴代码 先看前端显示出来的东西 OK 图片不重要,看代码 <!--微信图片 ...

  8. 在命令提示符窗口下(cmd)使用指令操作并编译java代码,运行java编译代码

    使用cmd操作java代码,编译.java文件,运行.class文件. 操作步骤: 1:创建一个文件夹: 例如:在e盘根目录(\)下面创建一个名为Hello的文件夹: 使用md指令:如图 在e盘中会生 ...

  9. DD打卡

    一.安装逍遥安卓模拟器 二.安装钉钉 三.设置当前GPS座标 位置模拟器: 链接: https://pan.baidu.com/s/1TC5QkrGAgHOJWtzJnX6vhA 提取码: bpu8 ...

  10. 团体程序设计天梯赛-练习集-L1-048. 矩阵A乘以B

    L1-048. 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca与Rb相等时,两个矩阵 ...