http://codeforces.com/contest/825/problem/E

一道裸的拓扑排序题。为什么需要反向拓扑排序呢?因为一条大下标指向小下标的边可能会导致小下标更晚分配到号码,导致字典序增大。而反向拓扑排序在上述情况,只会使大序号更晚分配到序号,而小序号还是较小的,根据字典序比对规则,当然是选择反向拓扑排序啦。

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#define N 200005
using namespace std;
int n, m, sum, cnt, flag;
int deg[N];
int head[N];
struct Node
{
int v, next;
};
struct cmp
{
bool operator()(int a, int b)
{
return a<b;
}
};
int k;
int ans[N];
Node edge[N << ];
void print(int num)
{
ans[num] = k--;
}
void topoSort(int n)
{
priority_queue<int, vector<int>, cmp> q;
for (int i = ; i <= n; i++)
if (deg[i] == )
q.push(i), deg[i]--;
//cout << q.size() << endl;
while (!q.empty())
{
int u = q.top();
q.pop(), print(u);
sum--;
for (int i = head[u]; i != -; i = edge[i].next)
{
Node e = edge[i];
deg[e.v]--;
if (deg[e.v] == ) q.push(e.v), deg[e.v]--; }
}
}
void ini()
{
for (int i = ; i <= n; i++)
deg[i] = , head[i] = -, flag = ;
cnt = , sum = n;
}
void add(int u, int v)
{
swap(u, v);
deg[v]++;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int main(int argc, const char * argv[]) {
while (scanf("%d%d", &n, &m) != EOF)
{
k = n;
int a, b;
ini();
for (int i = ; i<m; i++)
scanf("%d%d", &a, &b), add(a, b);
topoSort(n);
for (int i = ; i <= n; i++)
printf("%d ", ans[i]);
puts("");
}
return ;
}

CF-825E Minimal Labels 反向拓扑排序的更多相关文章

  1. Codeforces 825E - Minimal Labels

    825E - Minimal Labels 题意 给出 m 条有向边,组成有向无环图,输出一个 1 到 n 组成的排列,每个数只能出现一次,表示每个点的标号.如果有边 \((u, v)\) 那么 \( ...

  2. 逃生(HDU4857 + 反向拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题面是中文题面,就不解释题意了,自己点击链接去看下啦~这题排序有两个条件,一个是按给定的那个序列 ...

  3. HDU-4857-逃生-反向拓扑排序+优先队列

    HDU-4857 题意就是做一个符合条件的排序,用到拓扑序列. 我一开始wa了多发,才发现有几个样例过不了,发现1->2->3...的顺序无法保证. 后来就想用并查集强连,还是wa: 后来 ...

  4. 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. 【HDOJ4857】【反向拓扑排序】

    http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  6. POJ3687 反向拓扑排序

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16032   Accepted: 4713 D ...

  7. HDU 2647 Reward【反向拓扑排序】

    Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. hdu 4857(好题,反向拓扑排序)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  9. HDU 4857 逃生 (反向拓扑排序 & 容器实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

随机推荐

  1. salt stack 远程命令

    salt stack 远程命令 salt stack是一种自动化的运维工具,可以同时对N台服务器进行配置管理.远程命令执行等操作. salt stack分为两个部分 salt-master,部署在控制 ...

  2. Vim 学习

    主要分为三种模式: 一般模式 编辑模式 命令行模式 光标的移动 单词级 比单纯的逐个字符的移动,效率要高 w or W 向移动到下一单词开头 ★★ b or B 向左移动到单词开头 ★★ 块级 gg文 ...

  3. Wijmo 2017 V1发布

    2017年Wijmo的第1个Release已经发布了!它充满了令人兴奋的新控件和新功能.一个新的TreeView控件:一个只有看到你才会相信的MultiAutoComplete控件:移动平台报表查看器 ...

  4. appium长按按钮

    public static AndroidDriver driver; /长按操作:waitAction的参数单位是ms/ public static void longClick(String id ...

  5. Android之使用传感器获取相应数据

    Android的大部分手机中都有传感器,传感器类型有方向.加速度(重力).光线.磁场.距离(临近性).温度等. 方向传感器:   Sensor.TYPE_ORIENTATION 加速度(重力)传感器: ...

  6. React Native组件之BackAndroid !安卓手机的物理返回键的使用

    ok!在安卓手机上,当我们用物理返回键的时候,会以一次性的将程序退出来,这样是很不好的体验,所以就需要使用RN的物理返回键组件:BackAndroid,其原理也就是 分析路由,然后pop()这样! o ...

  7. hdu 1011 Starship Troopers 树形背包dp

    Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. Ubuntu18.04的网络配置

    网卡与DNS配置 1)打开命令窗口(右键单机桌面选择Open Terminal或者用快捷键Ctrl+Alt+T打开终端),输入ip a查看自己的网卡编号 2)输入命令sudo vim /etc/net ...

  9. ubuntu16系统磁盘空间/dev/vda1占用满的问题

    参考文档: https://www.cnblogs.com/moonandstar08/p/6091507.html (系统磁盘空间/dev/xvda1占满原因分析) https://blog.csd ...

  10. [HTTP]_[C/C++]_[解析URL的转义字符百分比字符串]

    场景: 1.有时候获取一个超链接时,或者一个图片src时,里面的地址带有%XX,这样如果当成文件路径处理会不识别.所以要把转义字符解码. 2.它其实就是ASCII码的十六进制表示. 以下是stacko ...