思路:首先spfa求一下最短路,然後對於滿足最短路上的邊(dist[v]==dist[u]+w)加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。
1 #include2 #include3 #includeview code4 #include5 #include6 #include7
using
namespace
std;
8#define maxn 4444
9#define inf 1<<30
1011
struct
node;
14};
1516
intn;
17bool
mark[maxn];
18int
dist[maxn];
19 vector>g;
20void
spfa()
2140}41
}42}43
}4445struct
edgeedge[maxn*maxn];
4849
intne,nv;
50int
head[maxn];
5152
void insert(int u,int v,int
cap)
5364
65void
build()
6676}77
}78}79
80int
level[maxn],gap[maxn];
81void bfs(int
vt)8299}
100}
101102
intpre[maxn],cur[maxn];
103int sap(int vs,int
vt)104
125 aug=inf;
126}
127break
;128
}129
}130
if(flag)continue
;131
int minlevel=nv;
132for(int i=head[u];i!=-1;i=edge[i].next)
138}
139if(--gap[level[u]]==0)break
;140 level[u]=minlevel+1
;141 gap[level[u]]++;
142 u=pre[u];
143}
144return
maxflow;
145}
146147
148int
main()
149162
spfa();
163if(dist[n]==inf||n==1
)167
build();
168 printf("
%d\n
",sap(1
,n));
169}
170return0;
171 }
hdu 3599 最短路 最大流)
思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...
hdu3416 最短路 最大流
最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...
HDU5294 最短路,最大流
題意是給乙個n點m邊的無向圖,求最少去掉多少邊使得最短路不存在,和最短路存在的情況下最多去掉多少邊。把所有最短路上的邊搞進來,流量為1跑最大流,去掉多少邊只要搞個dp就能找到最短路圖上得最短的路,用m去減就行。因為n 2000,n 2複雜度隨便搞都行。坑點是有重邊。include include i...