#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
#define inf 0x3fffffff
#define N 200
struct node {
int v,w,next;
}bian[N*N*2],fbian[N*N*2];
int head[N],yong,tt;
int deep[N];//深度保留层次图
void addedge(int u,int v,int w) {
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
int bfs(int s) {//寻找层次图
int i,cur;
queue<int>q;
memset(deep,-1,sizeof(deep));
q.push(s);
deep[s]=1;
while(!q.empty()) {
cur=q.front();
q.pop();
for(i=head[cur];i!=-1;i=bian[i].next)
if(bian[i].w&&deep[bian[i].v]==-1) {
deep[bian[i].v]=deep[cur]+1;
q.push(bian[i].v);
}
}
if(deep[tt]!=-1)return 1;
return 0;
}
int Min(int a,int b) {
return a>b?b:a;
}
int dfs(int s,int limit) {//多次dfs
int i,cost=0,flow,v;
// printf("%d %d\n",s,head[s]);
if(s==tt) {return limit;}
for(i=head[s];i!=-1;i=bian[i].next) {
v=bian[i].v;
// printf("%d %d %d\n",s,v,bian[i].w);
if(bian[i].w&&deep[v]==deep[s]+1) {
// printf("%d\n",v);
flow=dfs(v,Min(limit-cost,bian[i].w));
if(flow>0) {
bian[i].w-=flow;
bian[i^1].w+=flow;
cost+=flow;
if(limit==cost)break;
}
else
deep[v]=-1;//如果再次遇到v就不会进行下去
}
}
return cost ;
}
int dinic_maxflow(int s) {//dinic算法模板
int sum=0;
while(bfs(1)) {
//for(i=1;i<=tt;i++)
// printf("%d\n",deep[i]);
sum+=dfs(1,inf);
}
return sum;
}
/*int visit[N];
void dfs1(int u) {
int i;
visit[u]=1;
for(i=head[u];i!=-1;i=bian[i].next) {
if(bian[i].w&&visit[bian[i].v]==0)
dfs1(bian[i].v);
}
}*/
int ds[N],dds,dt[N],ddt;
int fhead[N],fyong;
int main() {
int t,m,n,i,j,k,maxflow,ma,fma,fa,fb;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
yong=0;
memset(head,-1,sizeof(head));
while(m--) {
scanf("%d%d%d",&i,&j,&k);
addedge(i,j,k);//加入边
addedge(j,i,0);//退边
}
tt=n;
maxflow=dinic_maxflow(1);//最大流模板
dds=0;ddt=0;
/* memset(visit,0,sizeof(visit));
dfs1(1);*/
for(i=2;i<n;i++) {//根据deep是否为-1可以得到源点集和汇点集
if(deep[i]!=-1)//源点集
ds[++dds]=i;
else
dt[++ddt]=i;//汇点集
}
// printf("%d %d\n",dds,ddt);
/* for(i=2;i<n;i++) {
if(visit[i])
ds[++dds]=i;
else
dt[++ddt]=i;
}*/
for(i=0;i<yong;i++)//保留残留网络
fbian[i]=bian[i];
for(i=1;i<=n;i++)//保留残留网络
fhead[i]=head[i];
ma=0;
fyong=yong;//保留残留网络
for(i=1;i<=dds;i++)//枚举
for(j=1;j<=ddt;j++) {
fa=ds[i];fb=dt[j];
for(k=0;k<yong;k++)//加入了新边,必须跟新为原来的求最大流一次的残留网络
bian[k]=fbian[k];
memset(head,0,sizeof(head));
for(k=1;k<=n;k++) //因为加入了新边,所以必须跟新head的值为原来的残留网络
head[k]=fhead[k];
yong=fyong;//
addedge(fa,fb,inf);
addedge(fb,fa,0);
fma=dinic_maxflow(1);
if(fma>ma)//求出最大值
ma=fma;
}
printf("%d\n",ma+maxflow);
}
return 0;
}

hdu 2435 dinic算法模板+最小割性质的更多相关文章

  1. hdu 2435dinic算法模板+最小割性质

    hdu2435最大流最小割 2014-03-22 我来说两句 来源:hdu2435最大流最小割 收藏 我要投稿 2435 There is a war 题意: 给你一个有向图,其中可以有一条边是无敌的 ...

  2. POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

    妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...

  3. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  4. HDU1532最大流 Edmonds-Karp,Dinic算法 模板

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  5. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  6. POJ 3469.Dual Core CPU 最大流dinic算法模板

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 ...

  7. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  8. HDU 3526 Computer Assembling(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=3526 题意:有个屌丝要配置电脑,现在有n个配件需要购买,有两家公司出售这n个配件,还有m个条件是如果配件x和配件 ...

  9. [模板]最小割树(Gomory-Hu Tree)(luogu4897)

    给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不连通 Input 第一行两个数\ ...

随机推荐

  1. Linux学习笔记——例说makefile 索引博文

    0.前言     从学习C语言開始就慢慢開始接触makefile.查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...

  2. 【cl】selenium实例2:打开百度,输入hello world

    /*创建的类为junit class*/ package Selenium_lassen; import static org.junit.Assert.*; import java.io.File; ...

  3. java泛型具体解释

    为什么引入泛型 bug是编程的一部分,我们仅仅能尽自己最大的能力降低出现bug的几率,可是谁也不能保证自己写出的程序不出现不论什么问题. 错误可分为两种:编译时错误与执行时错误.编译时错误在编译时能够 ...

  4. jqm文件上传,上传图片,jqm的表单操作,jqm的ajax的使用,jqm文件操作大全,文件操作demo

    近期在论坛中看到.在使用html5中上传图片或文件,出现各种问题. 这一方面,我也一直没有做过,今天就抽出了一点时间来学习一下.如今的演示样例已经ok了,我就给大家分享一下,希望对大家有帮助. 好吧. ...

  5. Linux命令(三)——用户、群组管理命令

    一.用户和群组的配置文件 1./etc/passwd文件 该文件存储了所有用户的一些基本属性. /etc/passwd文件中所存信息的具体含义如下: 用户名:x表示必须使用密码登录:uid用户标识符: ...

  6. Linux - 设置SFTP服务用户目录权限

    我们有时会遇到这样的需求,限制一个Linux用户,让他只能在指定的目录下进行添加.修改.删除操作,并且只能使用sftp登录服务器,不能用ssh操作.这些可以通过配置sftp服务实现. 创建新用户www ...

  7. php连接符

    php连接符 很多时候我们需要将几个字符串连接起来显示,在PHP中,字符串之间使用 “点” 来连接,也就是英文中的半角句号 " . " ." . " 是字符串连 ...

  8. Head First 设计模式 —— 装饰器模式

    1. 装饰器模式与继承 与装饰器模式相比,继承更容易造成类爆炸: 装饰器模式:利用组合取代继承:

  9. B1965 [Ahoi2005]SHUFFLE 洗牌 数论

    这个题的规律很好找,就是奇数直接除二,偶数除二加n/2.把这个规律整理一下就是(x * 2) % (n + 1),然后就直接求逆元就行了.一直30分的原因是qpow函数传参的时候用的int,然而变量是 ...

  10. [Plugin] 文件上传利器SWFUpload使用指南

    SWFUpload是 一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在项目中用过几次,但它的配置参数太多了,用过后就忘记怎么用了,到以后要用时又得 到官网上看它的文档,真是太烦了. ...