HDU3416 最短路 最大流

2022-05-20 03:15:15 字數 2661 閱讀 1691

題意:

有向圖求沒有交集的a到b最短路的數量

很顯然要先將所有最短路上的邊取出來。

用正向跑一遍dis1,反向跑一遍dis2的方法

dis1[u] + dis2[v] + w == dis1[b]的邊就是最短路上的邊

但是要求沒有交集的最短路,想到最大流,每一條最短路上的邊都看作一條流量為1的邊,直接跑最大流即可。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define for(i, x, y) for(int i=x;i<=y;i++)

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

#define sca(x) scanf("%d", &x)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second

#define vec pointtypedef vector

vi;const

double eps = 1e-9

;const

int maxn = 2010

;const

int maxm = 2e5 + 10

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,tmp,k;

inta,b;

intdis[maxn],dis1[maxn],dis2[maxn];

struct

edgeedge[maxm * 2

];int

head[maxn],cnt;

inthead2[maxn],tot;

bool

vis[maxn];

struct

edge2edge2[maxm];

void

init()

void addedge(int u,int v,int w,int rw = 0

)int

q[maxn];

intdep[maxn],cur[maxn],sta[maxn];

bool bfs(int s,int t,int

n) }

}return

false;}

int dinic(int s,int t,int

n) maxflow +=tp;

for(int i = tail - 1; i >= 0 ; i --)

u = edge2[sta[tail] ^ 1

].to;

}else

if(cur[u] != -1 && edge2[cur[u]].cap > edge2[cur[u]].flow && dep[u] + 1 ==dep[edge2[cur[u]].to])

else

cur[u] =edge2[cur[u]].next;}}

}return

maxflow;

}void add(int u,int v,int w,int

flag)

struct

cmp};

void dijkstra(int

s) }

}}int

main()

scanf(

"%d%d

",&a,&b);

dijkstra(a);for(i,

1,n) dis1[i] =dis[i];

dijkstra(b);for(i,

1,n) dis2[i] =dis[i];

for(i,

1,n)}}

pri(dinic(a,b,n));

}#ifdef vscode

system(

"pause");

#endif

return0;

}

hdu3416 最短路 最大流

最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...

hdu 3599 最短路 最大流)

思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...

HDU5294 最短路,最大流

題意是給乙個n點m邊的無向圖,求最少去掉多少邊使得最短路不存在,和最短路存在的情況下最多去掉多少邊。把所有最短路上的邊搞進來,流量為1跑最大流,去掉多少邊只要搞個dp就能找到最短路圖上得最短的路,用m去減就行。因為n 2000,n 2複雜度隨便搞都行。坑點是有重邊。include include i...