hdu 6582 最短路 最小割)

2021-09-26 06:14:29 字數 1890 閱讀 7798

打完比賽,請教大佬,大佬口胡講解。

於是有了下面的**,(邊權和超過int,wa了兩發)

#include

using

namespace std;

// 優化解釋的**

const

int n =

20000

;const

int inf =

0x7fffffff

;const

long

long inf =

0x7fffffffffff

;struct edge1};

//可判重邊

struct isap

}void

addedge

(int from,

int to,

int cap)

void

bfs(

)//逆向進行bfs}}

}int

augumemt()

x=t;

while

(x!=s)

//增廣

//s[s] = 1;

return a;

}int

maxflow

(int s,

int t)

//根據情況前進或者後退,走到匯點時增廣

// cout

//是否可以前進

for(

int i=cur[x]

;i.size()

;i++

)//cur 從上次處理的弧下標開始 當前弧優化}if

(!ok)

//走不動了,撤退if(

--num[d[x]]==

0)break

;//如果走不動了,且這個距離值原來只有乙個,那麼s-t不連通,這就是所謂的「gap優化」

num[d[x]

=m+1]++

;//更新距離 更新距離數量

cur[x]=0

;//當前弧清零

if(x!=s)

x=edges[p[x]

].from;

//退一步,沿著父邊返回}}

return flow;

}}isap;

const

int maxn =

2e4;

//頂點數量

typedef pair <

long

long

,int

> pii;

struct edge };

struct dijkstra

edges.

clear()

;}void

addedge

(int u,

int v,

int d)

void

dijkstra

(int s)}}

}}dijks,dijkt;

int t;

int n, m;

intmain()

dijks.

dijkstra(1

);dijkt.

dijkstra

(n);

long

long mindis = dijks.d[n]

;//cout

(int i =

0; i < dijks.edges.

size()

; i++)}

//cout

maxflow(1

, n)

;printf

("\n");

}return0;

}

hdu 6582 path 最短路 最小割

題意 有n個點,m條單向帶權邊,起點為1,終點為n,如果開始沒有最短路輸出0,現在想堵住一些路,使堵之後的最短路值變大,或不存在。堵路的花費就是邊的權值,問最小花費。思路 找到最短路核心邊,再重新建邊,跑一遍最小割即可。找最短路核心邊要正向建邊找每點到起點的距離 假設為d i 再反向建邊找每點到終點...

HDU 6582 Path 最短路 最大流

題目大意 給出一張 n 個點和 m 條邊組成的有向圖,現在問讓最短路變長的最小花費是多少 題目分析 增加最短路的最小花費,我們可以將最短路上的邊單獨拿出來,再求一下最小割就好了,用了封裝後的演算法看起來非常舒服,但時間複雜度有點高。看別人都是100ms左右跑完,我的 是950ms劃過 include...

2019HDU多校Path 最短路最小割

給出乙個 n 個頂點 m 條邊的圖,要求阻塞一些邊,使得從 1 到 n 的最短路變長,求阻塞的邊長度和的最小值,不必保證阻塞後可達。很顯然,要阻塞的邊肯定在最短路圖上,先跑一遍單源最短路,求出最短路圖。要使最短路變長,肯定要同時切斷原有的所有最短路,又要是長度 相當於流量 和最小,很容易想到就是求最...