拓扑排序+set

如果我们直接记录所有路径是不行的,那么我们要降低路径的数量,于是我们把最短路径转换到边上,这样我们就只有m条路径了。

先计算出f[i]和g[i]表示正反拓扑最长链,把所有g插到set里,然后按照拓扑序依次枚举删点,把之前加入过的边删除,删除g[u],查询最大值,然后加入后继边每条边的权值就是f[x]+g[to]+1,再加入f[u]这样我们按照拓扑序就不用加入之前删掉的边,因为我们是按照拓扑序删的,这样后面删的点肯定会影响之前的最长链,如果不影响则说明最长链已经被枚举完了,所以之前的最长链自然也受影响。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + ;
int n, m, tot, ans = 0x3f3f3f3f, p;
vector<int> G[N], rev[N];
int in[N], a[N], f[N], g[N];
int rd()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
multiset<int> s;
int main()
{
n = rd();
m = rd();
for(int i = ; i <= m; ++i)
{
int u = rd(), v = rd();
G[u].push_back(v);
rev[v].push_back(u);
++in[v];
}
queue<int> q;
for(int i = ; i <= n; ++i) if(in[i] == ) q.push(i);
while(!q.empty())
{
int u = q.front();
a[++tot] = u;
q.pop();
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
f[v] = max(f[v], f[u] + );
if(--in[v] == ) q.push(v);
}
}
for(int i = n; i; --i)
{
int u = a[i];
for(int j = ; j < rev[u].size(); ++j)
{
int v = rev[u][j];
g[v] = max(g[v], g[u] + );
}
}
for(int i = ; i <= n; ++i) s.insert(g[i]);
for(int i = ; i <= n; ++i)
{
int u = a[i];
multiset<int> :: iterator it;
it = s.find(g[u]);
if(it != s.end()) s.erase(it);
for(int j = ; j < rev[u].size(); ++j)
{
it = s.find(f[rev[u][j]] + g[u] + );
s.erase(it);
}
if(!s.empty()) if(*(s.rbegin()) < ans) ans = *(s.rbegin()), p = u;
for(int j = ; j < G[u].size(); ++j)
s.insert(g[G[u][j]] + f[u] + );
s.insert(f[u]);
}
printf("%d %d\n", p, ans);
return ;
}

最新文章

  1. jsp页面无法识别el表达式的解决方案
  2. 通过easyui tab添加的子页面JS脚本必须放在body才生效
  3. SQL Server 2008 master 数据库损坏解决总结
  4. IIs管理服务一直启动失败的原因之一
  5. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发
  6. C#文本选中及ContextMenuStrip菜单使用
  7. 黑盒测试在App自动化测试中的应用
  8. epoll函数及三种I/O复用函数的对比
  9. linux网址
  10. android的edittext输入长度
  11. highlight a DOM element on mouse over, like inspect does
  12. swiper插件的使用demo
  13. 2018 ACM-ICPC World Finals B.Comma Sprinkler
  14. 微信小程序入门一
  15. 二分(HDU2289 Cup)
  16. Python迷宫游戏(基础版)
  17. [HAOI2017]供给侧改革
  18. [翻译]怎么写一个React组件库(一)
  19. 【文文殿下】【HAOI2008】硬币购物
  20. linux中的网络基础

热门文章

  1. ffmpeg H264 编解码配置
  2. PC常用电源IC、MOS、三极管、二极管厂家
  3. 宜人贷蜂巢API网关技术解密之Netty使用实践
  4. 如何学习Java?
  5. 面向对象基础——String类
  6. 【转】IDA 调试 Android
  7. toad for oracle中文显示乱码
  8. 3438: 小M的作物[最小割]
  9. 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
  10. 基于live555实现的跨平台高性能RTSPServer流媒体服务器EasyIPCamera