/*
* 此题同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. NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络

    NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络 机器之心 ​ 已认证的官方帐号 49 人赞同了该文章 选自arXiv,作者:Xinyun Chen.Chang Liu. ...

  2. 去除空格函数trim

    实际查询中,经常存在多个tables,需要统一查询比如segments总大小或者索引或者主键等,我们得到大量的tables表名称,但是SQL查询,每次需要手工添加双引号,去除空格很麻烦. 可以通过文本 ...

  3. ABP的UnitOfWork内部SaveChanges无效

    应用层一个AppService默认是一个工作单元,默认是开启的,默认是事务的.因为应用服务方法应该是原子的且一般都会使用数据库. 但是有些情况需要关闭工作单元 1.AppService有多个操作需要操 ...

  4. Optional 理解

    目录 Optional 理解 1. 含义 2. Optional 类中方法 3. Optional 对象不应该作为方法参数 Optional 理解 1. 含义 Optional 是一个容器对象,该容器 ...

  5. (三)springmvc之注解的基本使用

    一.@Controller @Controller 标记一个类是Controller 二.RequestMapping  地址映射 2.1 Value的操作. 注解在类上面    (父)       ...

  6. c#基础知识梳理(二)

    上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10818256.html 一.变量 一个变量只不过是一个供程序操作的存储区的名字.在 C# 中,每个变量都有一 ...

  7. JS基础_构造函数修改

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

  8. Java内存模型(JMM)

    JVM与线程(线程在JVM中) 1.JVM什么时候启动?         类被调用时启动,此时会启动JVM线程然后再是其他的线程(main) 2.JVM内存区域 除了程序计数器(PC)之外都有可能发生 ...

  9. pytorch报错:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'

    转载自: https://blog.csdn.net/qq_24305433/article/details/80844548 由于训练模型时使用的是新版本的pytorch,而加载时使用的是旧版本的p ...

  10. wepy全局拦截器

    wepy有支持全局拦截器,但是请求需要使用wepy.request().then(): 在app.wpy文件中配置以下内容,与data同级 constructor(){ super(); this.u ...