HDU3416 Marriage Match IV(最大流+最短路)
来源:互联网 发布:linux 安装字体 编辑:程序博客网 时间:2024/06/05 19:16
城市A和B之间有一些有向边,求A,B之间的走最短路有多少种方法,即点可以重复走,而边不能。
首先求最短路,然后把在最短路上的边拖到新图里,容量为1,求最大流。判断一条边是否在最短路上:
#include<cstdio>#include<cstring>#include<queue>#include<vector>#define MAXN 1010#define MAXM 200010using namespace std;inline int Min(int a,int b){return a<b?a:b;}struct E{ int v,w,op; E(){} E(int a,int b,int c) {v = a; w = b; op = c;}};vector<E> g[MAXM];struct Edge{ int u,v,w,next;}edge[MAXM],edge2[MAXM];//把MAXM打成MAXN,调了一晚上,真是R了整个动物园了!int cnt,head[MAXN],cnt2,head2[MAXN];void add_edge(int u,int v,int w){ edge[cnt].u = u; edge[cnt].v = v; edge[cnt].w = w; edge[cnt].next = head[u]; head[u] = cnt++;}void add_edge2(int u,int v,int w){ edge2[cnt2].u = u; edge2[cnt2].v = v; edge2[cnt2].w = w; edge2[cnt2].next = head2[u]; head2[u] = cnt2++;}int n,m,s,t,d1[MAXN],d2[MAXN],a,b,c;void init(){ memset(head,-1,sizeof head); memset(head2,-1,sizeof head2); cnt = cnt2 = 0;}bool inque[MAXN];void SPFA1(){ memset(d1,0x3f,sizeof d1); memset(inque,0,sizeof inque); queue<int> Q; inque[s] = 1,d1[s] = 0; Q.push(s); while(!Q.empty()) { int u = Q.front(); Q.pop(),inque[u] = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(d1[u]+edge[i].w < d1[v]) { d1[v] = d1[u]+edge[i].w; if(!inque[v]) inque[v] = 1,Q.push(v); } } }}void SPFA2(){ memset(d2,0x3f,sizeof d2); memset(inque,0,sizeof inque); queue<int> Q; inque[t] = 1,d2[t] = 0; Q.push(t); while(!Q.empty()) { int u = Q.front(); Q.pop(),inque[u] = 0; for(int i = head2[u]; i != -1; i = edge2[i].next) { int v = edge2[i].v; if(d2[u]+edge2[i].w < d2[v]) { d2[v] = d2[u]+edge2[i].w; if(!inque[v]) inque[v] = 1,Q.push(v); } } }}int flow,d[MAXN],vd[MAXN];int aug(int i,int augco){ int j,augc = augco,mind = n-1,delta,sz = g[i].size(); if(i == t) return augco; for(j = 0; j < sz; j++) { int v = g[i][j].v; if(g[i][j].w) { if(d[i] == d[v]+1) { delta = Min(augc,g[i][j].w); delta = aug(v,delta); g[i][j].w -= delta; g[v][g[i][j].op].w += delta; augc -= delta; if(d[s] >= n) return augco - augc; if(augc == 0) break; } if(d[v] < mind) mind = d[v]; } } if(augco == augc) { vd[d[i]]--; if(vd[d[i]] == 0) d[s] = n; d[i] = mind+1; vd[d[i]]++; } return augco - augc;}void sap(){ flow = 0; memset(d,0,sizeof d); memset(vd,0,sizeof vd); vd[0] = n; while(d[s] < n) flow += aug(s,0x3f3f3f3f);}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); init(); for(int i = 1; i <= m; i++) { scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c); add_edge2(b,a,c); } scanf("%d%d",&s,&t); SPFA1(); SPFA2(); for(int i = 0 ; i < cnt; i++) { int u = edge[i].u,v = edge[i].v; if(d1[u]+d2[v]+edge[i].w == d1[t]) { g[u].push_back(E(v,1,g[v].size())); g[v].push_back(E(u,0,g[u].size()-1)); } } sap(); printf("%d\n",flow); for(int i = 1; i <= n; i++) g[i].clear(); }}
0 0
- HDU3416 Marriage Match IV(最大流+最短路)
- hdu3416 Marriage Match IV(网络流+最短路)
- HDU3416 Marriage Match IV(spfa+最大流SAP)
- hdu 3416 Marriage Match IV 【网络最大流+最短路】
- HDU 3416 Marriage Match IV(最短路+最大流)
- hdoj 3416 Marriage Match IV 【最大流 + 最短路】
- hdu 3416 Marriage Match IV (最短路+最大流)
- HDU 3416 Marriage Match IV(最短路+最大流)
- [HDU 3416]Marriage Match IV[最大流][最短路]
- HDOJ 3416 Marriage Match IV【最短路+最大流】
- HDU-3416 Marriage Match IV(最大流+最短路)
- HDU 3416 Marriage Match IV(最短路+最大流)
- HDU-3416 Marriage Match IV(最短路+最大流)
- 【网络流】hdu3416 Marriage Match IV
- HDU3416 Marriage Match IV【网络流】
- HDU 3416 Marriage Match IV(中等,好题) [最大流]最短路+最大流
- HDU 3416 Marriage Match IV(最短路+网络流之最大流)
- hdu 3416 Marriage Match IV 【图论-网络流-最短路+最大流(spfa + Dinic)】
- JS延迟加载机制函数(Lazyload)
- 贪心算法—Problem B&I
- HiveQL:数据操作
- 加载中dialog的另类实现
- 安卓手机通过 Fiddler代理上网教程,抓包
- HDU3416 Marriage Match IV(最大流+最短路)
- 线程安全,线程同步,synchronized
- 深入理解Java的接口和抽象类
- Uva 272TEX Quotes (f符号转换)
- Android开发技术注意事项
- HDU 5641 King's Phone
- opencv读写xml 、yml文件
- 【POJ 1837】Balance(01背包)
- 位域