n 個點 m 條邊帶權有向圖,問每條邊最多只能走一次時從 s 到 t 的最短路徑數量。
因為題目限制了每條邊最多只能走一次,所以不能直接用最短路來搞。但是我們可以轉化為網路流,所以可以設定邊的容量為 1。當然,首先需要找到在最短路上的邊,可以通過兩遍最短路求得,然後用這些邊跑(跑最小流肯定會tle)最大流得到的就是答案。
當然題中給的是有向邊,所以從t做最短路的時候要把原來的邊刪除,再新增一遍反向邊,不能直接當做無向邊來做。
dijkstra(s, dist1); // 跑s到所有點的最短路
dijkstra(t, dist2); // 跑t到所有點的最短路
dist1[a[i]] + c[i] + dist2[b[i]] == dist1[t] // 最短路上的邊
// nuoyanli
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define min(a, b) a > b ? b : a
#define max(a, b) a < b ? b : a
#define ll long long int
#define mod 998244353
#define mem(a,b) memset(a,b,sizeof(a))
using
namespace std;
const
int maxn =
1010
;const
int maxm =
200010
;int dist1[maxn]
, dist2[maxn]
;bool vis[maxn]
;int n, m, sum;
struct node
bool
operator
<
(const node & t)
const};
struct edge };
vector edge[maxn]
;void
add_edge
(int u,
int v,
int w)
void
dijkstra
(int s,
int dist)
dist[s]=0
; priority_queue q;
q.push
(node
(s, dist[s]))
;while
(!q.
empty()
)}}}
struct edges
edges
(int u,
int v,
int cap):u
(u),
v(v)
,cap
(cap)
} es[maxm]
;int r, s, t;
vector <
int> tab[maxn]
;// 邊集
int dis[maxn]
;int cur[maxn]
;// 弧優化
void
add_edges
(int u,
int v,
int cap)
intbfs()
}}return dis[t]
< inf;
// 返回是否能夠到達匯點
}int
dinic
(int x,
int maxflow)}}
return0;
// 找不到增廣路 退出
}int
init()
return ans;
}int a[maxm]
, b[maxm]
, c[maxm]
;signed
main()
scanf
("%d%d"
,&s,
&t);
dijkstra
(s, dist1)
;// 跑s到所有點的最短路
for(
int i =
0; i <= sum;
++i)edge[i]
.clear()
;for
(int i =
1; i <= m;
++i)
add_edge
(b[i]
, a[i]
, c[i]);
// 反向加邊
dijkstra
(t, dist2)
;// 跑t到所有點的最短路
r =0;
for(
int i =
0; i <= sum; i++
)tab[i]
.clear()
;for
(int i =
1; i <= m;
++i)
int ans =
init()
;// 求最大流
printf
("%d\n"
, ans);}
return0;
}
sgu 185 最短路 最大流
題意 求兩條不公邊的最短路,存在則輸出兩條路徑,不存在則輸出no solution 經過無數的re 22,wa 20和mel終於用最短路 最大流給a啦,感謝蒼天的解救啊!剛開始用的費用流解決 建圖源點到1建一條容量為2,費用為0的邊,n到匯點連一條容量為2,費用為0的邊,原圖中的邊 u,v 容量為1...
hdu 3599 最短路 最大流)
思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...
hdu3416 最短路 最大流
最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...