最短路+最大流
用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...