Marriage Match IV 最大流 最短路

2021-09-29 09:54:03 字數 2931 閱讀 2173

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...