P2685 [TJOI2012]橋

P2685?[TJOI2012]橋?

思路:

先求出最短路: d1[u] : u 到 1 的最短路, d2[u] : u 到 n 的最短路

再求出一條從 1 到 n 的最短路鏈,然后從鏈上的每一個點出發dfs, 求出:

l[u] : u 到 1 的最短路徑過中和鏈的交點(離 1 最近的)

r[u] : u 到 n 的最短路徑過中和鏈的交點(離 n 最近的)

然后對于一條非鏈上的邊( u? ->? v ),邊權為 w ,對于鏈上的 l[u] 到 r[v] 之間的邊任意刪一條邊,

最短路都有可能變成 d1[u] + w + d2[v] 然后在鏈上維護這個的最小值,就能知道刪掉鏈上的每條邊對最短路的影響

代碼:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//headconst int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m, u, v, w, tot, d1[N], d2[N], link[N], id[N], l[N], r[N], a[N];
int head[N], cnt = 0;
bool vis[N*2];
struct edge {int to, w, nxt;
}edge[N*4];
void add(int u, int v, int w) {edge[++cnt] = {v, w, head[u]};head[u] = cnt;
}
priority_queue<pii, vector<pii>, greater<pii> > q;
int tree[N<<2], lazy[N<<2];
void push_up(int rt) {tree[rt] = min(tree[rt<<1], tree[rt<<1|1]);
}
void push_down(int rt) {tree[rt<<1] = min(tree[rt<<1], lazy[rt]);tree[rt<<1|1] = min(tree[rt<<1|1], lazy[rt]);lazy[rt<<1] = min(lazy[rt<<1], lazy[rt]);lazy[rt<<1|1] = min(lazy[rt<<1|1], lazy[rt]);lazy[rt] = INF;
}
void build(int rt, int l, int r) {lazy[rt] = INF;if(l == r) {tree[rt] = INF;return ;}int m = l+r >> 1;build(ls);build(rs);push_up(rt);
}
void down(int rt, int l, int r) {if(l == r) {a[l] = tree[rt];return ;}if(lazy[rt] != INF) push_down(rt);int m = l+r >> 1;down(ls);down(rs);push_up(rt);
}
void update(int L, int R, int x, int rt, int l, int r) {if(L <= l && r <= R) {tree[rt] = min(tree[rt], x);lazy[rt] = min(lazy[rt], x);return ;}if(lazy[rt] != INF) push_down(rt);int m = l+r >> 1;if(L <= m) update(L, R, x, ls);if(R > m) update(L, R, x, rs);push_up(rt);
}void Dijkstra(int s, int *d) {for (int i = 1; i <= n; ++i) d[i] = INF;d[s] = 0;q.push({0, s});while(!q.empty()) {pii p = q.top();q.pop();int u = p.se;if(d[u] < p.fi) continue;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(d[v] > p.fi + w) {d[v] = p.fi + w;q.push({d[v], v});}}}
}
void dfs(int u, int s, int *bl, int *d) {bl[u] = s;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;//if(vis[(i+1)/2]) continue;if(bl[v] == 0 && id[v] == 0 && d[u] + w == d[v]) dfs(v, s, bl, d);}
}
int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= m; ++i) {scanf("%d %d %d", &u, &v, &w);add(u, v, w);add(v, u, w);}Dijkstra(1, d1);Dijkstra(n, d2);tot = 0;u = 1;while(u != n) {link[++tot] = u;id[u] = tot;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(d2[v] + w == d2[u]){vis[(i+1)/2] = true;u = v;break;}}}link[++tot] = n;id[n] = tot;for (int i = 1; i <= tot; ++i) dfs(link[i], link[i], l, d1);for (int i = tot; i >= 1; --i) dfs(link[i], link[i], r, d2);build(1, 1, tot-1);for (int u = 1; u <= n; ++u) {for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(!vis[(i+1)/2]) {if(id[l[u]] < id[r[v]]) update(id[l[u]], id[r[v]]-1, d1[u] + w + d2[v], 1, 1, tot-1);}}}down(1, 1, tot-1);int ans = 0, cnt = 0;for (int i = 1; i < tot; ++i) {if(a[i] > ans) {ans = a[i];cnt = 1;}else if(a[i] == ans) {cnt++;}}if(ans == d1[n]) cnt = m;printf("%d %d\n", ans, cnt);return 0;
}

?

轉載于:https://www.cnblogs.com/widsom/p/10599870.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252055.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#結構類型圖

轉載于:https://www.cnblogs.com/kangao/p/8674838.html

C# 全局鉤子實現掃碼槍獲取信息

1.掃描槍獲取數據原理基本相當于鍵盤數據&#xff0c;獲取掃描槍掃描出來的數據&#xff0c;一般分為兩種實現方式。 a&#xff09;文本框輸入獲取焦點&#xff0c;掃描后自動顯示在文本框內。 b&#xff09;使用鍵盤鉤子&#xff0c;勾取掃描槍虛擬按鍵&#xff0c;根據按鍵頻…

Centos下安裝mysql(二進制版)

Centos下安裝mysql&#xff08;二進制版&#xff09; 1.下載安裝包&#xff0c;選擇相應的平臺、版本&#xff0c;比如&#xff0c;選擇64位Linux平臺下的MySQL二進制包“Linux-Generic &#xff08;glibc 2.5&#xff09;&#xff08;x86&#xff0c;64-bit&#xff09;&#…

使用gradle多渠道打包

以友盟的多渠道打包為例&#xff0c;如果我們須要打包出例如以下渠道&#xff1a;UMENG, WANDOUJIA, YINGYONGBAO。 第一種方法。是須要創建文件的。我們在寫完我們的代碼之后&#xff0c;在app/src以下。分別創建和main同級目錄的目錄umeng, wandoujia, yingyongbao,這三個目錄…

SMMS 2016 啟用深色主題

1、用文本類編輯器 打開C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio目錄下的 ssms.pkgundef 2、去除// Remove Dark theme行以下的注釋 3、重新打開SMMS&#xff0c;如果還沒有出現“深色”主題&#xff0c;請執行第4點 4、打開powershell【…

四大步驟,徹底關閉Win10自動更新

盡管Win11已經發布了一段時間&#xff0c;但目前互聯網上大部分電腦用戶所使用的的操作系統仍是Win10&#xff0c;對于Win10&#xff0c;筆者相信大部分人應該都不陌生&#xff0c;作為目前市面上占比最高的電腦系統&#xff0c;Win10的許多功能和操作邏輯都十分優秀&#xff0…

LeetCode算法題-Repeated String Match(Java實現)

這是悅樂書的第289次更新&#xff0c;第307篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第156題&#xff08;順位題號是686&#xff09;。給定兩個字符串A和B&#xff0c;找到A必須重復的最小次數&#xff0c;使得B是它的子字符串。 如果沒有這樣的解決方案&a…

php

●轉載于:https://www.cnblogs.com/volcanorao/p/8678104.html

Vs快捷鍵設置(可搭配Vim使用)

設置方式: 通過在Vs菜單欄的工具->選項->環境->鍵盤。 常用快捷鍵: 推薦鍵位編輯.轉到定義Alt G切換標題代碼文件Alt Q查看.向前導航Alt D查看.向后導航Alt A調試.調用堆棧Alt 7調試.監視1Alt 8調試.內存1Alt 9查看.查找符號結果Alt 1查看.錯誤列表Alt …

虛擬機windows7安裝啟動MYSQL5.7

一.環境 環境&#xff1a;虛擬機VMVare 系統&#xff1a;windows7旗艦版 MYSQL版本&#xff1a;mysql5.7.25 二.具體步驟 1.首先下載安裝mysql5.7.25&#xff0c;這里用的是安裝版的mysql&#xff0c;網上大多數都是推薦去官網下載&#xff0c;這里推薦的是清華大學開源鏡像站…

故障轉移架構的本質:數據中心的基礎設施過剩

數據中心構成了全球互聯基礎設施的核心&#xff0c;我們稱之為“云”。從根本上講&#xff0c;云計算指的是基礎設施從桌面計算&#xff08;文件和應用程序存儲在計算機的本地硬盤上&#xff09;到在線計算&#xff08;文件和應用程序存儲在可通過互聯網遠程訪問的數據中心中&a…

CentOS啟動Tomcat巨慢

在本地開發環境&#xff0c;應用正常啟動。 在CentOS測試環境&#xff0c;應用啟動速度也是正常的。 但是在阿里云的生產環境&#xff0c;tomcat啟動超級慢&#xff0c;并且在最終打印出來以下內容&#xff1a; org.apache.catalina.util.SessionIdGenerator createSecureRando…

Oracle 存儲過程

什么是存儲過程&#xff1f;存儲過程是一種命名的PL/SQL程序塊&#xff0c;它是由一些T-SQL語句組成的代碼塊&#xff0c;這些T-SQL語句代碼像一個方法一樣實現一些功能&#xff08;對單表或多表的增刪改查&#xff09;&#xff0c;可以有參數、輸入輸出參數&#xff0c;通常沒…

查看Oracle 版本信息

select * from v$version;轉載于:https://www.cnblogs.com/hanje/p/10614555.html

ubuntu上安裝docker

在Ubuntu16.04上安裝Docker Docker是一個開源的容器引擎&#xff0c;它有助于更快地交付產品。Docker可將應用程序和基礎設施層隔離&#xff0c;并且將基礎設施當作程序一樣進行管理。使用Docker&#xff0c;可以更快地打包&#xff0c;測試以及部署應用程序&#xff0c;并可以…

字符串問題之 在有序但含有空的數組中查找字符串

盡可能使用二分查找 假設在 left right 之間查找 關鍵是mid處理過程 導致 left 跟 right 的改變 控制去哪里尋找 分如下情況&#xff1a; 若 mid處 不為空&#xff0c;并且 此處就是 str 那么記下 mid &#xff0c;同時把right-1 &#xff08;往左尋找&#xff09; 若…

Python_48re模塊的sub方法

sub是替換的功能 sub(模型&#xff0c;替換為的字符&#xff0c;目標原字符串&#xff0c;替換次數) import re yuanchuan1qaz2wsx3edc4rfv5tgb new_strre.sub(\d,INTNUM,yuanchuan,2) #若果沒有2表示默認替換所有的 print (new_str) #輸出結果為&#xff1a;INTNUMqazINTNUMw…

個人筆記-vuex

個人筆記-vuex 最近想要沉淀下自己的知識體系&#xff0c;以前光看不記&#xff0c;當時記得&#xff0c;過段時間記憶就模糊了&#xff0c;好腦子不如爛筆頭&#xff0c;古人誠不欺我&#xff0c;所以現在決定給用自己的語言方式來給自己記個筆記。 vuex vuex 有什么好講的呢&…

常用模塊之hashlib,configparser,logging模塊

常用模塊二 hashlib模塊 hashlib提供了常見的摘要算法&#xff0c;如md5和sha1等等。 那么什么是摘要算法呢?摘要算法又稱為哈希算法、散列算法。它通過一個函數&#xff0c;把任意長度的數據轉換為一個長度固定的數據串&#xff08;通常用16進制的字符串表示&#xff09;。 注…

iPhone屏幕各種尺寸分辨率(更新至XS)

iPhone屏幕各種尺寸分辨率&#xff08;更新至XS&#xff09; DeviceLogic PointLogic PixelSizeScaleiPhone 2G480 320480 3203.51xiPhone 3480 320480 3203.51xiPhone 3GS480 320480 3203.51xiPhone 4480 320960 6403.52xiPhone 4S480 320960 6403.52xiPhone 5568 …