hdu 6582 path 最短路 最小割

2022-08-15 04:51:13 字數 1396 閱讀 4356

題意:有n個點,m條單向帶權邊,起點為1,終點為n,如果開始沒有最短路輸出0,現在想堵住一些路,使堵之後的最短路值變大,或不存在。堵路的花費就是邊的權值,問最小花費。

思路:找到最短路核心邊,再重新建邊,跑一遍最小割即可。找最短路核心邊要正向建邊找每點到起點的距離(假設為d[i]),再反向建邊找每點到終點的距離(假設為d2[i]),如果一條邊起點為u,終點為v,邊權為w,若d[u]+d2[v]+w==d[n]則這是一條最短路核心邊。

**:

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=20100

;const

int maxm=20100

;const ll inf=1e18;

struct

nodee[

2*maxm],e2[2*maxm],e3[2*maxm];

inth[maxn],h2[maxn],h3[maxn],depth[maxn];

ll d[maxn],d2[maxn];

bool

vis[maxn];

intn,m,st,ed,cnt,cnt2,cnt3;

void

init()

void add(int u,int v,ll w)//

正向建邊

void add2(int u,int v,ll w)//

反向建邊

void add3(int u,int v,ll w)//

重新建邊

bool spfa()//

求每點到1的最短距離 }}

}return d[n]==inf;

}void re_spfa()//

求每點到n的最短距離 }}

}}

void create_map()//

重新建邊

}}bool bfs()}}

return

false;}

ll dfs(

intu,ll dis)

}return

res;

}void dinic()//

dinic求最小割

printf(

"%lld\n

",ans);

}int

main()

if(spfa())//

特判,沒有最短路

printf("

0\n"

);

else

}return0;

}

HDU 6582 Path 最短路 最大流

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

hdu 6582 最短路 最小割)

打完比賽,請教大佬,大佬口胡講解。於是有了下面的 邊權和超過int,wa了兩發 include using namespace std 優化解釋的 const int n 20000 const int inf 0x7fffffff const long long inf 0x7ffffffffff...

最短路徑 path

題目描述 給出一張包含n個節點m條邊的無向圖,請你求出圖上兩點s,t間的最短路徑長度 請大家自行處理重邊和自環 輸入 第一行兩個數n,m,分別表示節點數和邊數,以空格隔開。之後m行,每行3個數u,v,w,表示點u和v間有一條權值為w的邊。最後一行,兩個數s,t表示選擇的兩個點,以空格隔開。輸出 輸出...