/*
* 此题同bzoj2725
* 增加了枚举边的操作
*/
#include <bits/stdc++.h> const int N = 2e5 + ;// oo = 999999999; #define LL long long const LL oo = 9e18; int n, m, S, T;
int Short_path[N], Snum[N], Tnum[N], Id[N], path_js;
bool vis[N];
int head[N], now;
struct Node {int u, v, w, nxt;} G[N << ];
LL dis_s[N], dis_t[N];
LL Minn[N << ], Ans[N]; inline void Add(int u, int v, int w) {
G[++ now].v = v, G[now].w = w, G[now].nxt = head[u], head[u] = now;
} struct Node_ {
int u; LL dis;
bool operator < (const Node_ a) const {return dis > a.dis;}
}; std:: priority_queue <Node_> Q; void Dijkstra(int start, LL dis_[]) {
for(int i = ; i <= n; i ++) dis_[i] = oo, vis[i] = ;
Node_ now; now = (Node_) {start, }; dis_[start] = ;
Q.push(now);
while(!Q.empty()) {
Node_ topp = Q.top();
Q.pop();
if(vis[topp.u]) continue;
vis[topp.u] = ;
for(int i = head[topp.u]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(dis_[v] > dis_[topp.u] + G[i].w) {
dis_[v] = dis_[topp.u] + G[i].w;
Q.push((Node_) {v, dis_[v]});
}
}
}
} inline void Bfs(int x, LL dis_[], int bel[]) {
std:: queue <int> Q1;
Q1.push(Short_path[x]);
bel[Short_path[x]] = x;
while(!Q1.empty()) {
int topp = Q1.front();
Q1.pop();
for(int i = head[topp]; ~ i; i = G[i].nxt) {
int v = G[i].v;
if(!Id[v] && !bel[v] && dis_[v] == dis_[topp] + G[i].w) {
bel[v] = x;
Q1.push(v);
}
}
}
} #define lson jd << 1
#define rson jd << 1 | 1 void Sec_G(int l ,int r, int jd, int x, int y, LL num) {
if(x <= l && r <= y) {
Minn[jd] = std:: min(Minn[jd], (LL)num);
return ;
}
int mid = (l + r) >> ;
if(x <= mid) Sec_G(l, mid, lson, x, y, num);
if(y > mid) Sec_G(mid + , r, rson, x, y, num);
} void Dfs_tree(int l, int r, int jd) {
if(l == r) {
Ans[l] = Minn[jd];
return ;
}
int mid = (l + r) >> ;
Minn[lson] = std:: min(Minn[lson], Minn[jd]);
Minn[rson] = std:: min(Minn[rson], Minn[jd]);
Dfs_tree(l, mid, lson), Dfs_tree(mid + , r, rson);
} #define gc getchar() inline LL read() {
LL x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} bool visit[N << ]; int main() {
n = read(), m = read();
for(int i = ; i <= (N << ); i ++) Minn[i] = oo;
for(int i = ; i <= n; i ++) head[i] = -;
for(int i = ; i <= m; i ++) {
int u = read(), v = read(), w = read();
Add(u, v, w), Add(v, u, w);
}
S = , T = n;
Dijkstra(S, dis_s);
Dijkstra(T, dis_t);
for(int i = S; i != T; i = i) {
// visit[i] = 1;
Short_path[++ path_js] = i;
Id[i] = path_js;
for(int j = head[i]; ~ j; j = G[j].nxt) {
if(dis_t[i] == G[j].w + dis_t[G[j].v]) {
i = G[j].v;
visit[j] = ;
break;
}
}
}
Short_path[path_js + ] = T, Id[T] = path_js + ;
for(int i = ; i <= path_js; i ++) Bfs(i, dis_s, Snum);
for(int i = path_js + ; i >= ; i --) Bfs(i, dis_t, Tnum);
for(int i = ; i <= n; i ++) {
for(int j = head[i]; ~ j; j = G[j].nxt) {
int v = G[j].v;
if(visit[j]) continue;
if(Snum[i] < Tnum[v] && Snum[i] && Tnum[v]) {
Sec_G(, path_js, , Snum[i], Tnum[v] - , dis_s[i] + G[j].w + dis_t[v]);
}
}
}
Dfs_tree(, path_js, );
LL Dis = , js;
for(int i = ; i <= path_js; i ++) {
if(Ans[i] > Dis && Ans[i] != oo) Dis = Ans[i], js = ;
else if(Ans[i] == Dis) js ++;
}
if(Dis == dis_s[T]) js += m - path_js;
std:: cout << Dis << " " << js;
return ;
}
?

bzoj4400的更多相关文章

  1. bzoj4400: tjoi2012 桥

    先传代码再填坑 #include <iostream> #include <cstdio> #include <cmath> #include <cstrin ...

  2. BZOJ4400 TJOI2012桥(最短路+线段树)

    首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...

随机推荐

  1. spring中使用动态代理(AOP)

    spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; ...

  2. 分布排序(distribution sorts)算法大串讲

    ref : https://dsqiu.iteye.com/blog/1707383   本文内容框架: §1 鸽巢排序(Pigeonhole) §2 桶排序(Bucket Sort)   §3 基数 ...

  3. Map 集合遍历的4种方法

    Map 集合初始化时,指定集合初始值大小. 说明:HashMap 使用 HashMap(int initialCapacity) 初始化. 正例:initialCapacity = (需要存储的元素个 ...

  4. 怎样使用wordpress模板建站

    这里仅整理一个思路, 日后会详细补充. 1. 首先得下载 wordpress安装包, 上传到服务器上的 /var/www/html, 然后解压. 2. 然后安装apache 并启动, 启动一般是使用: ...

  5. win10 右键新建卡顿

    前段时间不知道自己搞啥了,右键变得很慢,找了一些常规的解决方案,什么清除注册表等等的,对我来说,没好用. 然后将就继续使用,然后觉得是office的问题,卸载,重装2010的,发现还是一样卡... 继 ...

  6. JavaScript检测浏览器

    Detect Browser <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  7. ES6对数组的增强

    来看数组的改变,Array.from()可以将类数组对象变为数组: Array.of方法用于将一组值,转化为数组: 寻找数组中是否拥有某项find().findIndex(),里面要放置回调函数: 要 ...

  8. css滑动门技术

    滑动门的核心技术: 为了使各种特殊形状的背景能够自适应元素中文本内容的多少,以使自由拉伸滑动 利用css精灵(主要是背景位置)和盒子padding撑开宽度,以便适应不同字数的导航栏 一般经典布局 &l ...

  9. Android开发中UI相关的问题总结

    UI设计和实现是Android开发中必不可少的部分,UI做不好的话,丑到爆,APP性能再好,估计也不会有多少人用吧,而且如果UI和业务代码逻辑中间没有处理好,也会很影响APP的性能的.稍微总结一下,开 ...

  10. redis修改大key报Argument list too long的解决办法:

    线上一个业务出现异常:redis的一个大大大大大key数据有问题,所以导出修改再导入,但遇到了问题: [root@ ~]# /usr/local/redis/bin/redis-cli -h 127. ...