bzoj4400: tjoi2012 桥
先传代码再填坑
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#define N 100005
#define M 400005
#define INF 0x7FFFFFFF using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while ('0'<=ch && ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} struct STnode{
int l,r;
int tag;
}; int a[N];
struct SegmentTree{
STnode t[4*N];
void PushDown(int x){
if (t[x].l==t[x].r) return;
if (t[x].tag==INF) return;
t[x<<1].tag=min(t[x<<1].tag,t[x].tag);
t[x<<1^1].tag=min(t[x<<1^1].tag,t[x].tag);
t[x].tag=INF;
}
void build(int x,int l,int r){
t[x].l=l;t[x].r=r;t[x].tag=INF;
if (l==r) return;
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1^1,mid+1,r);
}
void modify(int x,int l,int r,int value){
PushDown(x);
if (l<=t[x].l&&t[x].r<=r){
t[x].tag=min(t[x].tag,value);
return;
}
int mid=(t[x].l+t[x].r)/2;
if (l<=mid) modify(x<<1,l,r,value);
if (r>mid) modify(x<<1^1,l,r,value);
}
int getans(int x){
if (t[x].l==t[x].r){a[t[x].l]=t[x].tag;return t[x].tag;}
PushDown(x);
return max(getans(x<<1),getans(x<<1^1));
}
} st; struct edge{
int adj,next,len;
int id;
edge(){}
edge(int _adj,int _next,int _len):adj(_adj),next(_next),len(_len){}
} e[M];
int n,g[N],m;
void AddEdge(int u,int v,int w){
e[++m]=edge(v,g[u],w);g[u]=m;
} struct HeapNode{
int pos,value;
HeapNode(){}
HeapNode(int _pos,int _value):pos(_pos),value(_value){}
};
bool operator >(const HeapNode &x,const HeapNode &y){
return x.value>y.value;
}
priority_queue<HeapNode,vector<HeapNode> ,greater<HeapNode> > h; int fa[N];
int mind[N];
bool flag[N];
int from[N];
void dijkstra(int _s){
memset(mind,127,sizeof(mind));
memset(flag,0,sizeof(flag));
h.push(HeapNode(_s,mind[_s]=0));
fa[_s]=from[_s]=0;
while (!h.empty()){
int u=h.top().pos;
h.pop();
flag[u]=1;
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (mind[v]>mind[u]+e[i].len){
mind[v]=mind[u]+e[i].len;
h.push(HeapNode(v,mind[v]));
fa[v]=u;from[v]=i;
}
}
while (!h.empty()&&flag[h.top().pos]) h.pop();
}
} int deep[N];
void dfs(int u){
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (!deep[v]) deep[v]=deep[u];
dfs(v);
}
} void rebuild(){
memset(deep,0,sizeof(deep));
deep[n]=1;
for (int i=n;fa[i];i=fa[i]) deep[fa[i]]=deep[i]+1;
memset(g,0,sizeof(g));m=1;
for (int i=2;i<=n;++i) AddEdge(fa[i],i,0);
dfs(1);
} int u[M],v[M],w[M];
int dist[N]; int main(){
n=read();int m0=read();
memset(g,0,sizeof(g));m=1;
for (int i=1;i<=m0;++i){
u[i]=read();v[i]=read();w[i]=read();
AddEdge(u[i],v[i],w[i]);e[m].id=i;
AddEdge(v[i],u[i],w[i]);e[m].id=i;
}
dijkstra(n);
for (int i=1;i<=n;++i) dist[i]=mind[i];
dijkstra(1);
for (int i=2;i<=n;++i) w[e[from[i]].id]=0;
rebuild();
st.build(1,1,deep[1]-1);
for (int i=1;i<=m0;++i)if (w[i]){
if (deep[u[i]]>deep[v[i]]) swap(u[i],v[i]);
int x=deep[u[i]],y=deep[v[i]];
if (x==y) continue;
st.modify(1,x,y-1,dist[u[i]]+w[i]+mind[v[i]]);
}
int ans=st.getans(1),cnt=0;
for (int i=1;i<deep[1];++i) cnt+=(a[i]==ans);
printf("%d %d\n",ans,ans==mind[n]?m0:cnt);
return 0;
}
bzoj4400: tjoi2012 桥的更多相关文章
- BZOJ4400 TJOI2012桥(最短路+线段树)
首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...
- P2685 [TJOI2012]桥
P2685 [TJOI2012]桥 思路: 先求出最短路: d1[u] : u 到 1 的最短路, d2[u] : u 到 n 的最短路 再求出一条从 1 到 n 的最短路链,然后从链上的每一个点出发 ...
- 洛谷2685 [TJOI2012]桥
[TJOI2012]桥 题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数. 做法:我们先从1为起点.从n为起点跑两边dij,获得每一个点到起点1.终点n的最短距离,其实距离和边权 ...
- [TJOI2012]桥(最短路+线段树)
有n个岛屿, m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前的能力,是不可能通过的 ...
- [TJOI2012]桥
Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- hub,桥,交换机,路由器的区别
1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...
- 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评
最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...
随机推荐
- 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))
需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字 ...
- HTML 学习笔记(URL)
URL也被称为网址 URL可以由单词组成,比如"www.baidu.com" 或者是因特网协议IP地址:192.168.1.253.大多数人在网上冲浪时,会键入网址的域名,因为名称 ...
- 事故记录:php-cgi进程过多导致系统资源耗尽
事故现象:机房一台服务器运行一段时间后,突然发现系统资源即将被耗尽! 1)top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出1--共有602个进程,但其中有601个进程休 ...
- HTTP 错误 500.22 - Internal Server Error
HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 最可能的原因: 此应用程序在 system.web/http ...
- P3384 【模板】树链剖分
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 2178 表达式运算Cuties
2178 表达式运算Cuties 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给出一个表达式,其中运算 ...
- 【WPF】TextBox样式重写注意事项
1.普通控件重写需要添加一行 <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="C ...
- IE6/IE7/IE8/Firefox/Chrome/Safari的CSS hack兼容一览表
浏览器兼容问题一直是前段开发工程师比较头痛的问题,熟悉了里面的规则也就变得简单了,这里有一份资料可以分享给大家,大家平时开发过程中遵循这个规律的话,会变得轻松多了: 各浏览器CSS hack兼容表: ...
- Activity中获取view的高度和宽度为0的原因以及解决方案
在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得 ...
- C# 7.0 新特性2: 本地方法
本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...