題意:
有向圖求沒有交集的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...