Gym-101102-K-Topological Sort
K. Topological Sort
题面
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this graph doesn’t contain any cycles.
Your task is to find the lexicographically largest topological sort of the graph after removing a given list of edges.
A topological sort of a directed graph is a sequence that contains all nodes from 1 to N in some order such that each node appears in the sequence before all nodes reachable from it.
Input
The first line of input contains a single integer T, the number of test cases.
The first line of each test case contains two integers N and M (1 ≤ N ≤ 105) , the number of nodes and the number of edges to be removed, respectively.
Each of the next M lines contains two integers a and b (1 ≤ a < b ≤ N), and represents an edge that should be removed from the graph.
No edge will appear in the list more than once.
Output
For each test case, print N space-separated integers that represent the lexicographically largest topological sort of the graph after removing the given list of edges.
题意
给出N个点,每个对于每个对(u,v)若u<v,那么连一条边,给出m条边,先删除他们,问拓扑序字典序最大是多少。
考场上想了半天,大概最后想用最长路做,但是搞不定。。然后看题解嘛、。。 用线段树维护,操作有:区间修改 单点修改 查询最靠右0的位置。
代码
#include <bits/stdc++.h>
using namespace std;
int T;
int n;
int m;
int x,y;
vector<int> g[100010];
int a[4000010];
int lazy[4000010];
void build(int l,int r,int o)
{
if (l==r)
{
a[o]=l-1;
return;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
a[o]=min(a[o<<1],a[o<<1|1]);
return;
}
void push_down(int o)
{
lazy[o<<1]+=lazy[o];
lazy[o<<1|1]+=lazy[o];
a[o<<1]+=lazy[o];
a[o<<1|1]+=lazy[o];
lazy[o]=0;
}
void add(int L,int R,int l,int r,int o,int dlt)
{
if (L<=l && R>=r)
{
lazy[o]+=dlt;
a[o]+=dlt;
return;
}
push_down(o);
int mid=(l+r)>>1;
if (L<=mid) add(L,R,l,mid,o<<1,dlt);
if (R>mid) add(L,R,mid+1,r,o<<1|1,dlt);
a[o]=min(a[o<<1],a[o<<1|1]);
}
int query(int l,int r,int o)
{
if (l==r) return l;
push_down(o);
int mid=(l+r)>>1;
if (a[o<<1|1]==0) return query(mid+1,r,o<<1|1);
else return query(l,mid,o<<1);
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while (T--)
{
cin>>n>>m;
memset(a,0,sizeof a);
memset(lazy,0,sizeof lazy);
build(1,n,1);
for (int i=1;i<=m;i++)
{
cin>>x>>y;
g[x].push_back(y);
add(y,y,1,n,1,-1);
}
for (int i=1;i<n;i++)
{
int find=query(1,n,1);
cout<<find<<" ";
if (find+1<=n) add(find+1,n,1,n,1,-1);
for (int o=0;o<g[find].size();o++) add(g[find][o],g[find][o],1,n,1,1);
add(find,find,1,n,1,2*n);
}
int find=query(1,n,1);
cout<<find<<endl;
for (int i=1;i<=n;i++) g[i].clear();
}
}
题目链接
http://codeforces.com/gym/101102/problem/K
Gym-101102-K-Topological Sort的更多相关文章
- 【拓扑排序】【线段树】Gym - 101102K - Topological Sort
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...
- topological sort~~~~初学
今天讲了topological sort 问题: 判环:记录入队的点数,若<n则有环,可证: 算法:o(n):queue or stack,而不是o(n^2)枚举 #. 关系运算图(vijos ...
- Some facts about topological sort
Definition: a topological sort of a DAG G is a sort such that for all edge (i,j) in G, i precedes j. ...
- topological sort
A topological sortof a dag G is a linear ordering of all its vertices such that if G contains anedg ...
- 拓扑排序(Topological Sort)
Graph 拓扑排序(Topological Sort) 假设一个应用场景:你用 C 编写了一个爬虫工具,其中有很多自定义的库:queue.c.queue.h.stack.c.stack.h.heap ...
- 6-16 Topological Sort(25 分)
Write a program to find the topological order in a digraph. Format of functions: bool TopSort( LGrap ...
- [Algorithms] Topological Sort
Topological sort is an important application of DFS in directed acyclic graphs (DAG). For each edge ...
- gym/102021/K GCPC18 背包dp算不同数和的可能
gym/102021/K 题意: 给定n(n<=60)个直线 ,长度<=1000; 可以转化为取 计算 ans = (sum + 10 - g) / ( n + 1) 在小于5的条件下 ...
- [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序
一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...
- Gym - 100283K K. Cubes Shuffling —— 贪心
题目链接:http://codeforces.com/gym/100283/problem/K 题解: 要使其相邻两项的差值之和最小,那么越靠中间,其数值越小. 那么剩下的问题就是如何放数字了.一开始 ...
随机推荐
- 在ALV界面添加下拉框
1.在alv界面表单属性中设置 if wa_fieldcat-fieldname = 'YC_MARK'. wa_fieldcat-edit = 'X'. ...
- java 与 或 非 异或 & | ~ ^
1.与运算符 & 两个操作数中位,否则结果为0 2.或运算符 | 两个位,否则就为0 3.非运算符 ~ 如果位为,结果是,如果位为1,结果是0 4.异或运算符 ^ 两个操作数的位中,,不同则结 ...
- BOM DOM jQuery
. BOM . location相关 . location.href . location.href="http://www.sogo.com" . location.reload ...
- c#特性attribute:(二)
日志 初始化 特性类里边构造函数里的属性,带参数不带参数的 ******特性是编译时是不加到il 中的,是加到metadata中 ,本身对程序运行没有影响,除非我们主动的读取和使用区供反射可以使用. ...
- opencv 学习总结 方法总结
师者传道受业解惑也,图片识别是门学科,需要师者传教,才会较快解开谜团,解开困惑,没人引导,要学会图片识别,有点难度,因为其中的做法超出自己的想象范围. 大家都知道,在超出想象范围,或者从未想到的方式, ...
- ofo退押金脚本
同事钉钉给的 因为押金一直没退,电话很难打进去,咨询客服排队要等好久,一直几千位. 长时间挂机就自动退出客服了,所以自动写了一个脚本,目前已经成功退押金了.所以共享出来 1.关注ofo小黄车订阅号,注 ...
- BZOJ 1977[BeiJing2010组队]次小生成树 Tree - 生成树
描述: 就是求一个次小生成树的边权和 传送门 题解 我们先构造一个最小生成树, 把树上的边记录下来. 然后再枚举每条非树边(u, v, val),在树上找出u 到v 路径上的最小边$g_0$ 和 严格 ...
- djiango控制语句
{# 从0开始的索引#} {% for foo in value %} {# 从0开始的索引#} <p>{{ forloop.counter0 }}: {{ foo }}</p> ...
- CSS学习笔记:盒子模型
盒子模型(CSS basic box model):When laying out a document, the browser's rendering engine represents each ...
- Android Camera后台拍照
http://item.congci.com/item/android-camera-houtai-paizhao 有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍 ...