hdu3416 最短路 最大流

2021-06-26 23:55:31 字數 3826 閱讀 9879

最短路+最大流

用spfa算出 s到各個點的最短路 t到各個點的最短路

if( dis1[i] + dis2[i] + map[i][j] ==dis1[t] )

滿足這種情況說明邊在最短路上,所以根據這個方法建邊

然後最大流解決

這道題很值得體會體會

/*

* this code is made by linmeichen

* problem: hdu 3416

* type of problem: 網路流 水題

* thinking:

* feeling:

*/#include#include#include#include#include#include#include#include#include#includeusing namespacestd;

typedef

long longlld;

typedef

unsigned intud;#define oo 0x3f3f3f3f

#define eatline() char chch;while((chch=getchar())!='\n')continue;

#define memsetmax(a) memset(a,0x3f,sizeof a)

#define memsetzero(a) memset(a,0,sizeof a)

#define memsetmin(a) memset(a,-1,sizeof a)

#define memsetfalse(a) memsetzero(a)

#define pq priority_queue

#define q queue

#define maxn 1008

#define maxm 200008

structedgee[maxm];

intlevel[maxn],h[maxn];

intstack[maxn];

inthead[maxn],mark[maxn];

intdis1[maxn],dis2[maxn];

intmap[maxn][maxn];

intc[maxn][maxn];

intq[maxm],front,rear;

inttol,n,m;

voidspfa(

ints,

intt,

intdis,

intf)}}

}}voidadd_edge(

intu,

intv,

intf)

voidbuild(

ints,

intt)

}boolbfs(

ints,

intt)}}

returnfalse;

}intdinic(

ints,

intt)

}for(

inti=0;i<top;i++)

top=flag;maxflow+=minflow;u=e[stack[top] ^1].v;//反向邊的鄰接點

}

for(

inti=h[u];i!= -1;i=h[u] =e[i].next)

if(h[u] != -1)

else}}

returnmaxflow;

}int

main

()else if

(map[u][v] ==w)c[u][v]++;

}scanf("%d%d", &s, &t);spfa(s,t,dis1,0);spfa(t,s,dis2,1);build(s,t);printf("%d\n",dinic(s,t));

}return0;

}

HDU3416 最短路 最大流

題意 有向圖求沒有交集的a到b最短路的數量 很顯然要先將所有最短路上的邊取出來。用正向跑一遍dis1,反向跑一遍dis2的方法 dis1 u dis2 v w dis1 b 的邊就是最短路上的邊 但是要求沒有交集的最短路,想到最大流,每一條最短路上的邊都看作一條流量為1的邊,直接跑最大流即可。inc...

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