[BZOJ2125]最短路(圓方樹DP)

題意:仙人掌圖最短路。

算法:圓方樹DP,$O(n\log n+Q\log n)$

首先建出仙人掌圓方樹(與點雙圓方樹的區別在于直接連割邊,也就是存在圓圓邊),然后考慮點u-v的最短路徑,顯然就是:在圓方樹上u-v的路徑上的所有邊權之和,加上每個環(方點)中連出去的兩個點的最短距離。

現在問題就是:如何求出環上兩個點的最短路徑。考慮這樣設定邊權,首先顯然圓圓邊的邊權就是原圖的邊權,然后設一個環在搜索樹中深度最小的點為這個環的根,則方圓邊的邊權是環的根到這個點的最短距離,這個可以在Tarjan的時候直接求出。

但是圓方樹問題通常需要在LCA處分圓方點討論。首先如果LCA是圓點,那么直接做即可。如果是方點,就需要決定要不要走環的另一側,這個同樣直接討論即可。

具體見代碼,感覺思路還是比較清晰的。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=l; i<=r; i++)
 4 using namespace std;
 5 
 6 const int N=20010;
 7 int n,m,Q,u,v,w,tot,tim,top,dep[N],len[N],type[N],stk[N];
 8 int dfn[N],low[N],dis[N],lst[N],fa[N][16],sm[N][16];
 9 
10 struct E{
11     int cnt,h[N],to[N<<1],nxt[N<<1],val[N<<1];
12     void add(int u,int v,int w){ to[++cnt]=v; val[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt; }
13 }G,G1;
14 
15 void work(int x,int k){
16     tot++; int t; len[tot]=dis[stk[top]]-dis[x]+lst[stk[top]];
17     do{
18         t=stk[top--];
19         int A=dis[t]-dis[x],B=len[tot]-A;
20         G1.add(tot,t,min(A,B)); type[t]=(A<=B);
21     }while (t!=k);
22     G1.add(x,tot,0);
23 }
24 
25 void Tarjan(int x,int pre){
26     //printf("%d\n",x);
27     dfn[x]=low[x]=++tim; stk[++top]=x;
28     for (int i=G.h[x],k; i; i=G.nxt[i]){
29         if ((k=G.to[i])==pre) continue;
30         if (!dfn[k]){
31             dis[k]=dis[x]+G.val[i]; Tarjan(k,x);
32             //printf("%d %d %d %d\n",x,k,dfn[x],low[k]);
33             if (low[k]>dfn[x]) top--,G1.add(x,k,G.val[i]);
34             else if (low[k]==dfn[x]) work(x,k);
35             low[x]=min(low[x],low[k]);
36         }else low[x]=min(low[x],dfn[k]),lst[x]=G.val[i];
37     }
38 }
39 
40 void dfs(int x,int pre){
41     for (int i=G1.h[x],k; i; i=G1.nxt[i])
42         fa[k=G1.to[i]][0]=x,dep[k]=dep[x]+1,sm[k][0]=G1.val[i],dfs(k,x);
43 }
44 
45 int lca(int u,int v){
46     if (dep[u]<dep[v]) swap(u,v);
47     int t=dep[u]-dep[v],res=0;
48     for (int i=15; ~i; i--) if (t&(1<<i)) res+=sm[u][i],u=fa[u][i];
49     if (u==v) return res;
50     for (int i=15; ~i; i--) if (fa[u][i]!=fa[v][i])
51         res+=sm[u][i]+sm[v][i],u=fa[u][i],v=fa[v][i];
52     if (fa[u][0]<=n) return sm[u][0]+sm[v][0]+res;
53     int A=sm[u][0],B=sm[v][0],mn;
54     if (type[u]==type[v]) mn=min(abs(A-B),len[fa[u][0]]-abs(A-B));
55         else mn=min(A+B,len[fa[u][0]]-A-B);
56     return res+mn;
57 }
58 
59 int main(){
60     freopen("bzoj2125.in","r",stdin);
61     freopen("bzoj2125.out","w",stdout);
62     scanf("%d%d%d",&n,&m,&Q); tot=n;
63     rep(i,1,m) scanf("%d%d%d",&u,&v,&w),G.add(u,v,w),G.add(v,u,w);
64     Tarjan(1,0); dfs(1,0);
65     //rep(i,1,tot) printf("%d ",low[i]); puts("");
66     rep(j,1,15) rep(i,1,tot)
67         fa[i][j]=fa[fa[i][j-1]][j-1],sm[i][j]=sm[i][j-1]+sm[fa[i][j-1]][j-1];
68     rep(i,1,Q) scanf("%d%d",&u,&v),printf("%d\n",lca(u,v));
69     return 0;
70 }

?

轉載于:https://www.cnblogs.com/HocRiser/p/9143979.html

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

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

相關文章

20162317 2017-2018-1 《程序設計與數據結構》第8周學習總結

20162317 2017-2018-1 《程序設計與數據結構》第8周學習總結 教材學習內容總結 1、二叉查找樹的定義、性質2、向二叉查找樹中添加元素的方法3、在二叉查找樹中刪除元素的方法4、旋轉的定義、方法、意義 教材學習中的問題和解決過程問題1&#xff1a;我在17章中看到這么一句話&a…

ES6模塊的轉碼

瀏覽器目前還不支持ES6模塊,為了實現立刻使用,我們可以將其轉為ES5的寫法.除了Babel可以用來轉碼,還有以下兩個方法也可以用來轉碼: ES6 moudule transpilerSystemJS ES6 moudule transpiler是square公司開源的一個轉碼器,可以將ES6模塊轉為CommonJS模塊或AMD模塊,從而在瀏覽器…

Java基礎學習總結(22)——異常處理

2019獨角獸企業重金招聘Python工程師標準>>> 一、異常的概念 異常指的是運行期出現的錯誤&#xff0c;也就是當程序開始執行以后執行期出現的錯誤。出現錯誤時觀察錯誤的名字和行號最為重要。 1 package cn.javastudy.summary;2 3 public class TestEx{4 5 …

XAML中格式化日期

要求被格式化數據的類型是DateTime StringFormatyyyy-MM-dd StringFormat{}{0:yyyy-MM-dd}轉載于:https://www.cnblogs.com/changbaishan/p/9144584.html

130242014045 林承暉 第2次實驗

軟件體系結構的第二次實驗&#xff08;解釋器風格與管道過濾器風格&#xff09; 一、實驗目的 1&#xff0e;熟悉體系結構的風格的概念 2&#xff0e;理解和應用管道過濾器型的風格。 3、理解解釋器的原理 4、理解編譯器模型 二、實驗環境 硬件&#xff1a; 軟件&#xff1a;P…

AnularJS1事件

在Web應用的組件是松耦合的情況下&#xff0c;比如需要用戶驗證然后處理授權&#xff0c;即時的通信不總是可行的&#xff0c;因為組件沒有耦合在一起。 例如&#xff0c;如果后端對一個請求返回了狀態碼401&#xff08;表明一個未經授權的請求&#xff09;&#xff0c;我們期望…

Java基礎學習總結(8)——super關鍵字

2019獨角獸企業重金招聘Python工程師標準>>> 一、super關鍵字 在JAVA類中使用super來引用父類的成分&#xff0c;用this來引用當前對象&#xff0c;如果一個類從另外一個類繼承&#xff0c;我們new這個子類的實例對象的時候&#xff0c;這個子類對象里面會有一個父類…

conda鏡像

轉自https://blog.csdn.net/guilutian0541/article/details/81004769 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --set show…

Java基礎學習總結(17)——線程

2019獨角獸企業重金招聘Python工程師標準>>> 一、線程的基本概念 線程理解&#xff1a;線程是一個程序里面不同的執行路徑 每一個分支都叫做一個線程&#xff0c;main()叫做主分支&#xff0c;也叫主線程。 程只是一個靜態的概念&#xff0c;機器上的一個.class文件…

(轉)MySQL自帶的性能壓力測試工具mysqlslap詳解

mysqlslap 是 Mysql 自帶的壓力測試工具&#xff0c;可以模擬出大量客戶端同時操作數據庫的情況&#xff0c;通過結果信息來了解數據庫的性能狀況 mysqlslap 的一個主要工作場景就是對數據庫服務器做基準測試 例如我們拿到了一臺服務器&#xff0c;準備做為數據庫服務器&#x…

node.js HelloWord

創建 server.js var http require("http"); http.createServer(function(req,res){ //設置請求頭的編碼格式 res.writeHead(200,{Content-Type:text/html;charsetutf-8}); //設置網頁的編碼格式&#xff08;防止中文亂碼&#xff09; res.write("<head>&…

JavaScript --- this

介紹: this:引用環境執行的環境對象arguments:一個類數組對象,它包含傳入函數的所以參數callee:arguments對象的一個屬性,該屬性是一個指針,指向擁有arguments對象的函數caller:保存著調用當前函數的函數引用apply()方法:第一個參數是作用域&#xff0c;第二個參數是Array實例…

LeetCode Subarray Sum Equals K

原題鏈接在這里&#xff1a;https://leetcode.com/problems/subarray-sum-equals-k/description/ 題目&#xff1a; Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k. Example 1: Input:nums …

水木告白工作室:Java從零入門之模仿頭條資訊(一)

總體設計 一 &#xff1a;Java語言基礎 二 &#xff1a;Spring入門&#xff0c;模板語法和渲染 三 &#xff1a;數據庫交互iBatis集成 四&#xff1a; 用戶注冊 登陸 管理 五&#xff1a; 資訊發布 圖片上傳 資訊首頁 六&#xff1a; 評論中心 站內信 七&#xff1a; Redis入門…

架構師不可不知的十大可擴展架構

2019獨角獸企業重金招聘Python工程師標準>>> 可擴展性正是如今軟件設計領域最值得優先考慮的要素。然而&#xff0c;計算機科學家們還無法了解一套單獨的架構如何才能擴展至各類應用環境當中。相反&#xff0c;我們在數量繁多的方案中所設計出的可擴展性架構&#x…

Winform開發框架中工作流模塊的業務表單開發

在我們開發工作流的時候&#xff0c;往往需要設計到具體業務表單信息的編輯&#xff0c;有些是采用動態編輯的&#xff0c;有些則是在開發過程中處理的&#xff0c;各有各的優點&#xff0c;動態編輯的則方便維護各種各樣的表單&#xff0c;但是數據的綁定及處理則比較麻煩&…

JavaScript --- 跨瀏覽器的事件處理程序

var EventUtil {addHandler: function(element, type, handler) { // 添加事件處理程序if (element.addEventListener) { // DOM2級事件處理程序element.addEventListener (type, handler, false) ;} else if (element.attachEvent) { // IE事件處理程序element.attachEve…

RabbitMQ學習總結(2)——安裝、配置與監控

2019獨角獸企業重金招聘Python工程師標準>>> 一、安裝 1、安裝Erlang 1&#xff09;系統編譯環境&#xff08;這里采用linux/unix 環境&#xff09; ① 安裝環境 虛擬機&#xff1a;VMware Workstation 10.0.1 build Linux系統&#xff1a;CentOS6.5 rabbitMQ官網下…

nginx針對某個url限制ip訪問,常用于后臺訪問限制

nginx針對某個url限制ip訪問&#xff0c;常用于后臺訪問限制 假如我的站點后臺地址為&#xff1a; http://www.abc.net/admin.php 那么我想限制只有個別ip可以訪問后臺&#xff0c;那么需要在配置文件中增加&#xff1a;location ~ .*admin.* {allow 1.1.1.1;allow 12.12.12.0/…

JavaScript --- 跨瀏覽器的事件對象

var EventUtil{addHandler: function(element, type, handler){ // 添加事件方法if (element.addEventListener){element.addEventListener(type, handler, false); // 添加監聽事件,第3個參數false代表:冒泡階段} else if (element.attachEvent) {element.attachEvent("…