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的更多相关文章

  1. 【拓扑排序】【线段树】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 ...

  2. topological sort~~~~初学

    今天讲了topological sort 问题: 判环:记录入队的点数,若<n则有环,可证: 算法:o(n):queue or  stack,而不是o(n^2)枚举 #. 关系运算图(vijos ...

  3. 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. ...

  4. topological sort

    A topological sortof a dag G  is a linear ordering of all its vertices such that if G contains anedg ...

  5. 拓扑排序(Topological Sort)

    Graph 拓扑排序(Topological Sort) 假设一个应用场景:你用 C 编写了一个爬虫工具,其中有很多自定义的库:queue.c.queue.h.stack.c.stack.h.heap ...

  6. 6-16 Topological Sort(25 分)

    Write a program to find the topological order in a digraph. Format of functions: bool TopSort( LGrap ...

  7. [Algorithms] Topological Sort

    Topological sort is an important application of DFS in directed acyclic graphs (DAG). For each edge ...

  8. gym/102021/K GCPC18 背包dp算不同数和的可能

    gym/102021/K 题意: 给定n(n<=60)个直线 ,长度<=1000; 可以转化为取 计算 ans = (sum  + 10 - g) / ( n + 1)  在小于5的条件下 ...

  9. [MIT6.006] 14. Depth-First Search (DFS), Topological Sort 深度优先搜索,拓扑排序

    一.深度优先搜索 它的定义是:递归探索图,必要时要回溯,同时避免重复. 关于深度优先搜索的伪代码如下: 左边DFS-Visit(V, Adj.s)是只实现visit所有连接某个特定点(例如s)的其他点 ...

  10. Gym - 100283K K. Cubes Shuffling —— 贪心

    题目链接:http://codeforces.com/gym/100283/problem/K 题解: 要使其相邻两项的差值之和最小,那么越靠中间,其数值越小. 那么剩下的问题就是如何放数字了.一开始 ...

随机推荐

  1. Linux系统下重启Tomcat

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  2. android的图片的初步学习理解

    Android支持JPEG和PNG格式.GIF和BMP格式图片的支持. 图片最终要显示在屏幕上,都会对应一个屏幕上的点,即对应一个颜色值.不同格式的图片,只是不同压缩编码和解压算法. 也就是说,我们看 ...

  3. gearman中worker常驻后台,导致MySQL server has gone away

    产生这个原因主要有如下几点: 1.mysql服务宕机了 2.长时间没有操作,超过了wait_timeout的设置,mysql自动断开 3.mysql请求链接被主动kill 4.发送的请求或返回结果过大 ...

  4. 【gRPC使用问题1】gRPC的proto内import其他proto导致的一次小坑

    1.对于一些proto里面的定义,如果包含了 引入其他proto文件的 proto文件来说,生成的时候要注意.尤其是 引入的是官方框架内的 proto文件,如果自己没有提供的话,生成代码会报错! 具体 ...

  5. 2.Mysql SQL基础

    2.Mysql SQL基础2.1 SQL简介 SQL(Structure Query Language)是结构化查询语言.2.2 SQL使用入门 2.2.1 SQL分类 SQL分为DDL.DML(DQ ...

  6. HTML JavaScript语法练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Codeforces55D Beautiful numbers

    原题链接 虽然依旧是套模板,但是因为我太弱了,不会建状态,所以去看了题解.. 这里就直接引用我看的题解吧,写的不错的. 题解 //我的代码 #include<cstdio> #includ ...

  8. Photoshop零基础教程集锦,助你快速进阶为大佬,轻松、任性!!!

    现今,对于Web或App UI设计师而言,除了不断学习专业知识,提升设计技能.掌握一款得心应手的设计工具(例如设计师们常用的图像处理工具PhotoShop,矢量图绘制工具AI, 图形视频处理工具AE, ...

  9. xpath笔记

    参考 1.使用lxml.etree.parse()解析html文件,该方法默认使用的是“XML”解析器,所以如果碰到不规范的html文件时就会解析错误,报错代码如下: lxml.etree.XMLSy ...

  10. PHP连接SQLServer2012两例

    首先放上 PHP连接SQLServer的驱动下载地址 http://php.net/manual/zh/ref.pdo-sqlsrv.php 另外PHP for IIS管理工具 大家可以自己搜索一下 ...