UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>
I - 排名表
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
暑假前集训已经过了一半了,我们将会把当前排名公布出来。但是此刻秋实大哥却心急火燎,因为他不慎把排名删除了。
一共有n个人参加排名,每个人都有一个名次,没有哪两个人的名次是相同的。现在秋实大哥掌握的一些情报,比如Ai的名次要先于Bi。(编号从1开始)
你能帮秋实大哥恢复出排名表吗?
Input
第一行一个数字 T (T≤10),表示测试数据组数
每组测试数据,第一行两个数 n(1≤n≤200)和 m(0≤m≤40000),接下来m行,每行两个数a和b(1≤a,b≤N),表示a的名次要先于b
Output
对于每组测试数据,输出一行,从1号到n号每个人的名次。
如果有多个解,让编号为1的人的名次尽量小,然后让编号为2的人的名次尽量小,然后让编号为3的人的名次尽量小......
如果没有解,输出−1
Sample input and output
| Sample Input | Sample Output |
|---|---|
5 |
1 2 3 4 |
Hint
注意可能会有重边
解题思路:
首先,本题正向拓扑排序是不行的,即如果这样建边:
U 的名次先于 V , 即 V 向 U连边
因为题意比较绕,下文都这样叙述:
排名号越高,其名次越低,第一名的排名号是 1 ,它的名次是最高的.
我们按照 v 向 u建边,意思是v的排名号高于u.
无法保证
让编号为1的人的名次尽量小,然后让编号为2的人的名次尽量小,然后让编号为3的人的名次尽量小.
è 让编号为 1 的人的排名号尽量大,然后让编号为 2 的人的排名号尽量大….
我们拓扑排序的顺序是这样的:
每次寻找入度为 0 的点,将排名号赋给这个点,删边,重复.
如果有多个点入度都是 0 呢?我们不假思索的这样想:
我们为了保证题目条件,会使得我们会尽量保证这个点的编号尽量小(这样我们看起来符合了题目条件:编号小的人排名号尽量高),但是我们忽略了,题目要求是先尽力保证编号1的人,之后才是编号2的人….
所以,正向建边是错误的
注意,上面的证明非常不严格(Even it's a mistake),如果小伙伴谁有更好的证明,可在下面回复
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
const int maxn = + ;
int n,m,c[maxn],indig[maxn];
vector<int>E[maxn];
bool existedge[maxn][maxn];
int out[maxn]; bool dfs(int cur)
{
if (c[cur] == )
return true;
c[cur] = -;
for(int i = ; i < E[cur].size() ; ++ i)
{
int nextnode = E[cur][i];
if (c[nextnode] == -)
return false;
if (!c[nextnode] && !dfs(nextnode)) //exist 环
return false;
}
c[cur] = ;
return true;
} typedef struct point
{
int id,indig;
friend bool operator < (const point & x,const point & y)
{
return x.indig < y.indig;
}
point(int id,int indig)
{
this->id = id , this->indig = indig;
}
}; vector<point>v;
bool used[maxn]; void ansset()
{
memset(used,false,sizeof(used));
for(int i = ; i <= n ; ++ i)
v.pb(point(i,indig[i]));
sort(v.begin(),v.end());
int rank = ;
for(int i = ; i <= n ; ++ i)
{
int choose = v[].id;
int pos = ;
while( pos < v.size() && !v[pos].indig)
choose = max(choose,v[pos++].id);
out[choose] = n - rank++;
used[choose] = true;
for(int i = ; i < E[choose].size() ; ++ i)
indig[E[choose][i]]--;
v.clear();
for(int i = ; i <= n ; ++ i)
if(!used[i])
v.pb(point(i,indig[i]));
sort(v.begin(),v.end());
}
} int main(int argc,char *argv[])
{
int Case;
scanf("%d",&Case);
while(Case--)
{
scanf("%d%d",&n,&m);
memset(c,,sizeof(c));
memset(existedge,false,sizeof(existedge));
memset(indig,,sizeof(indig));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
if (existedge[v][u])
continue;
E[v].pb(u);
existedge[v][u] = true;
indig[u] ++;
}
int ans = ;
for(int i = ; i <= n ; ++ i)
if (!dfs(i))
{
ans = ;
break;
}
if (!ans)
printf("-1\n");
else
{
v.clear();
ansset();
for(int i = ; i <= n ; ++ i)
i == ? printf("%d",out[i]) : printf(" %d",out[i]);
printf("\n");
}
for(int i = ; i <= n ; ++ i)
E[i].clear();
}
return ;
}
UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>的更多相关文章
- UESTC_传输数据 2015 UESTC Training for Graph Theory<Problem F>
F - 传输数据 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>
L - 方老师和农场 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>
K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>
J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) S ...
- UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>
H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Others) Subm ...
- UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>
E - 树上的距离 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Subm ...
- UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory<Problem D>
D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory<Problem C>
C - 秋实大哥与时空漫游 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
- UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>
B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
随机推荐
- 跨平台utf8转unicode研究实现(2)
最近在用VC++开发一个小工具,平时用惯了.NET,用起VC++最郁闷的就是字符串处理.当然最最让人难于琢磨的就是字符集,编码之间的转换.通过这几天的研究,终于明白了Unicode和UTF-8之间编码 ...
- 分页标签:pager-taglib使用指南
一简介, Pager-taglib,支持多种风格的分页显示.实际上她是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合,会形成多种不一样的分页页面,风格各异,她自带 ...
- [原创作品] Express 4.x 接收表单数据
好久没有写博客,从现在开始,将介绍用nodejs进行web开发的介绍.欢迎加群讨论:164858883. 之前的express版本在接收表单数据时,可以统一用res.params['参数名'],但在4 ...
- MVC4 成员资格、 身份验证
SimpleMembership,成员资格提供程序. 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板 ASP.NET MVC 4 互联网模板中添加一些新的 ...
- Pig系统分析(6)-从Physical Plan到MR Plan再到Hadoop Job
从Physical Plan到Map-Reduce Plan 注:由于我们重点关注的是Pig On Spark针对RDD的运行计划,所以Pig物理运行计划之后的后端參考意义不大,这些部分主要分析流程, ...
- openssl AES加密算法API的使用示例
openssl为用户提供了丰富的指令,同时也提供了供编程调用的API,本文以使用128位aes算法的ecb模式进行加密和解密验证,如下所示 第一种方法,直接使用aes算法提供的api进行调用,代码如下 ...
- HTML与CSS入门——第八章 使用外部和内部链接
知识点: 1.链接锚的使用方法 2.在自己的网站上的页面之间链接的方法 3.链接到外部内容的方法 4.链接到一个E-mail地址的方法 5.在新浏览器窗口中查看链接的方法 6.用CSS为链接添加样式的 ...
- Docker的简单认知
Docker images: docker image是一个只读打模板,用来创建Docker 容器 Docker Registers 互联网上存储images的地方 Docker containers ...
- Linux命令:TOP
top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况,类似于Windows的任务管理 器.下面详细介绍它的使用方法. top - 02:53:32 up 16 ...
- Asp.net mvc4 + HighCharts + 曲线图
前端代码: @{ Layout = null;}<!DOCTYPE html><html><head> <title></title> &l ...