先求出最短路径,然后用最短路径上的边构建一个新图,在新图上求最小割。
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
int const N= 1010, M= 200010;
int n, m;
int const inf= 0x7fffffff;
int res;
struct Node{
Node(){}
Node(int a,int b ):adj(a), wt(b) {}
int adj, wt; };
struct cmp{
bool operator()( Node a, Node b ){
return a.wt> b.wt; }
};
vector<Node> mata[N], matb[N];
int S, T;
int dista[N], distb[N];
int dijks( int s, int t, int d[], vector<Node> mat[] ){
for( int i= 0; i<= n; ++i ) d[i]= inf;
d[s]= 0;
priority_queue<Node, vector<Node>, cmp> que;
que.push( Node( s, 0 ) );
while( !que.empty() ){
int u= que.top().adj, w= que.top().wt; que.pop();
if( w!= d[u] ) continue;
for( size_t i= 0; i< mat[u].size(); ++i ){
int v= mat[u][i].adj, t= mat[u][i].wt;
if( d[u]+ t< d[v] ){
d[v]= d[u]+ t;
que.push( Node( v, d[v] ) );
}
}
}
return d[t];
}
struct Edge{
int flow, adj;
Edge* next;
}tb[M];
Edge* mat[N], *Pre[N];
int cnt= -1;
inline Edge* reserve( Edge* p ){
return tb+ ( (p- tb)^ 1 );
}
inline void add( int u, int v, int c ){
++cnt;
tb[cnt].adj= v; tb[cnt].flow= c;
tb[cnt].next= mat[u]; mat[u]= tb+ cnt;
++cnt;
tb[cnt].adj= u; tb[cnt].flow= 0;
tb[cnt].next= mat[v]; mat[v]= tb+ cnt;
}
int que[M], ht[N], flag[N], path[N], head, tail;
int bfs(){
que[0]= S; head= 0; tail= 0;
for( int i= 0; i<= n; ++i ) ht[i]= -1; ht[S]= 0;
while( head<= tail ){
int u= que[head++];
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== -1 && p->flow ){
ht[p->adj]= ht[u]+ 1;
que[++tail]= p->adj;
}
}
return ht[T]!= -1;
}
int dfs( int u, int flow ){
if( u== T ) return flow;
int tf= 0, f;
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== ht[u]+ 1 && p->flow && flow> tf &&
( f= dfs( p->adj, min( p->flow, flow- tf ) ) ) ){
reserve( p )->flow+= f;
p->flow-= f;
tf+= f;
}
if( tf== 0 ) ht[u]= -1;
return tf;
}
void build(){
cnt= -1;
for( int i= 0; i<= n; ++i ) mat[i]= 0;
for( int u= 1; u<= n; ++u )
for( size_t i= 0; i< mata[u].size(); ++i ){
int v= mata[u][i].adj, w= mata[u][i].wt;
if( dista[u]+ w+ distb[v]== res ){
add( u, v, 1 );
}
}
}
int main(){
int test;
scanf("%d",&test );
while( test-- ){
scanf("%d%d",&n,&m );
for( int i= 0; i< m; ++i){
int u, v, d;
scanf("%d%d%d", &u, &v, &d );
mata[u].push_back( Node(v,d) );
matb[v].push_back( Node(u,d) );
}
scanf("%d%d", &S, &T );
dijks( S, T, dista, mata );
res= dijks( T, S, distb, matb );
build();
int ans= 0;
while( bfs() ) ans+= dfs( S, 0x7fffffff );
printf("%d\n", ans );
for( int i= 0; i<= n; ++i )
mata[i].clear(), matb[i].clear();
}
return 0;
}
分享到:
相关推荐
这份"HDU杭电 计算机网络实验报告"压缩包提供了丰富的实验材料,涵盖了多个关键的网络技术,包括交换机配置、路由协议、地址转换(NAT)、访问控制列表(ACL)以及动态主机配置协议(DHCP)等。以下是这些实验报告所...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
hdu 期末考试复习资料 计算机网络 编译原理 计算机图形学 编译原理 信息安全与技术 数据库应用系统开发
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...
【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
数学在ACM竞赛中扮演着重要角色,包括数论(模运算、同余方程、欧几里得算法等)、组合数学(排列组合、容斥原理、鸽巢原理等)、图论(网络流、最大匹配等)。理解并运用这些数学知识,可以解决很多看似复杂的问题...
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
hdu2101AC代码
【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...
【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
hdu 1166线段树代码
HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...
HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...