題意:有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表示選擇的兩個點,以空格隔開。輸出 輸出...