BZOJ3832Rally题解
一道思维神题....
我们像网络流一样加入原点S,与汇点T
用f[i]表示原点到i的最长路,用g[i]表示i到汇点的最长路
f数组与g数组都可以dp求出来的
接下来考虑如何通过这些信息来维护删除某个点的最长路
用拓扑序来删点
我们先将所有g数组加入一个集合中,
每次删点是就先将所有该点的入边的点的f[i]+g[x]从集合中删掉
然后此时集合中最大值就是删除这个点的最优解
然后再将每个点的出边i的f[x]+g[i]加入集合中
可以发现这个集合可以用堆来维护
# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<algorithm>
# include<queue>
using namespace std;
const int mn = ;
struct Grap{
struct edge{int to,next;};
edge e[mn*];
int head[mn],edge_max;
void add(int x,int y)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
head[x]=edge_max;
}
}A,B;
int deg[mn*],n,m,a[mn*];
int f[mn*],g[mn*];
void topolpgy()
{
int tail=,head=;
for(int i=;i<=n;i++)
if(!deg[i]) a[++head]=i;
//printf("%d %d\n",tail,head);
while(tail<=head)
{
int u=a[tail];
tail++;
for(int i=A.head[u];i;i=A.e[i].next)
{
deg[A.e[i].to]--;
if(!deg[A.e[i].to]) a[++head]=A.e[i].to;
}
}
}
struct Heap{
int heap[mn*],mark[mn*],top;
void ins(int x)
{
if(mark[x])
{
--mark[x];
return ;
}
heap[++top]=x;
int t=top;
while(t>)
{
if(heap[t]>heap[t>>])
swap(heap[t],heap[t>>]),t>>=;
else
break;
}
}
void del(int x)
{
mark[x]++;
}
void Pop()
{
heap[]=heap[top--];
int t=;
while(t<=top)
{
if( t<top && heap[t+]>heap[t] )
t++;
if(heap[t]>heap[t>>])
swap(heap[t],heap[t>>]),t<<=;
else
break;
}
}
int Top()
{
while(mark[heap[]])
mark[heap[]]--,Pop();
return heap[];
}
}T;
int main()
{
int x,y;
A.edge_max=,B.edge_max=;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
A.add(x,y),B.add(y,x);
deg[y]++;
}
topolpgy();
/*for(int i=1;i<=n;i++)
printf("%d ",a[i]);*/
int ans=,ans_len=0x3f3f3f3f;
for(int i=;i<=n;i++)
{
int u=a[i];
f[u]=max(f[u],);
for(int j=A.head[u];j;j=A.e[j].next)
f[A.e[j].to]=max(f[A.e[j].to],f[u]+);
}
for(int i=n;i>=;i--)
{
int u=a[i];
g[u]=max(g[u],);
for(int j=A.head[u];j;j=A.e[j].next)
g[u]=max(g[u],g[A.e[j].to]+);
}
/*for(int i=1;i<=n;i++)
printf("%d:%d %d\n",i,f[i],g[i]);*/
for(int i=;i<=n;i++)
T.ins(g[i]);
T.ins();
for(int i=;i<=n;i++)
{
int u=a[i];
for(int j=B.head[u];j;j=B.e[j].next)
{
T.del(f[B.e[j].to]+g[u]);
//printf("%d ",f[B.e[j].to]+g[u]);
}
//printf("\n");
T.del(g[u]);
if(T.Top()<ans_len)
{
ans_len=T.Top(),ans=u;
//printf("%d ",T.Top());
}
for(int j=A.head[u];j;j=A.e[j].next)
{
T.ins(f[u]+g[A.e[j].to]);
//printf("%d ",f[u]+g[B.e[j].to]);
}
T.ins(f[u]);
//printf("%d\n",ans_len-1);
}
printf("%d %d",ans,ans_len-);
return ;
}
BZOJ3832Rally题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Java面试总结-基础篇1
java多线程-- 自旋锁,偏向锁 好处:可以举Servlet和CGI的对比用户线程和守护线程的区别:用户线程结束后JVM会退出,然后守护线程才会终止(比如垃圾回收线程),如何在java中创建守护线程 ...
- 组件:参数验证props:组件参数验证语法
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- redis中重启和停止服务
首先需要打开两个终端,一个是服务端,一个是客户端 1.开启服务端 redis-server 2.开启客户端 redis-cli 关闭双方之间的连接: 在客户端中输入:redis-cli shutdow ...
- Django之ORM多表操作
1.创建一对多: 1.外键建在多的一方(如:一个出版社可出版多本书,所以建在书的表) 2.创建表: 1.创建外键 2.关联的表名 2.一对多数据的操作 2.1数据的添加: 第一种方法: 第二种方法: ...
- SQL _join on 和where的执行顺序
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...
- SpringMVC + Mybatis + Shiro + ehcache时缓存管理器报错。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilter' ...
- H5C3--属性选择器、兄弟选择器、伪类选择器
属性选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 做移动应用使用地图API时需要注意的问题
最近在做一个基于地点提醒的移动应用,当初考虑大家都心知肚明的原因,谨慎的选择了百度地图,现在想想其实完全没有必要,好的应用本来就不分国界的,最后可能还是得换回Google地图.毕竟Google地图在技 ...
- Mac OS X中,有三种方式来实现启动项的配置
Mac OS x 启动项设置 Mac OS X的启动原理: 1,mac固件激活,初始化硬件,加载BootX引导器. 2,BootX加载内核与内核扩展(kext). 3,内核启动launchd进程. 4 ...
- Java问题解读系列之String相关---String、StringBuffer、StringBuilder的区别
今天的题目是String.StringBuffer和StringBuilder的区别: 首先还是去官方的API看看对这三种类型的介绍吧,Go...... 一.继承类和实现接口情况 1.String类 ...