博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1273 Drainage Ditches 最大流-Dinic
阅读量:4349 次
发布时间:2019-06-07

本文共 1175 字,大约阅读时间需要 3 分钟。

#include
#include
#include
#include
using namespace std;const int N=205;const int INF=0x3f3f3f3f;int s[N][N];//记录图的邻接矩阵int d[N];//记录图中各点的层次int n,m;int min(int a,int b){ return a
Q; memset(d,-1,sizeof(d));//此处初始化要特别注意,以上版本的初始化就存在很大问题 d[1]=0;//如果处理不慎就很容易死循环 Q.push(1); while(!Q.empty()){ int v=Q.front();Q.pop(); for(int i=1;i<=n;i++){ if(d[i]==-1&&s[v][i]){
//此处应是s[v][i]!=0,而不是以上版本中的s[v][i]>0,因为dfs是可能会走错,这样可以对其进行修正。 d[i]=d[v]+1; Q.push(i); } } } return d[n]!=-1;}int dfs(int v,int cur_flow){ int dt=cur_flow; if(v==n)return cur_flow; for(int i=1;i<=n;i++){ if(s[v][i]>0&&d[v]+1==d[i]){ int flow=dfs(i,min(dt,s[v][i])); s[v][i]-=flow; s[i][v]+=flow; dt-=flow; } } return cur_flow-dt;}int dinic(){ int cur_flow,ans=0; while(bfs()){
//一次bfs可以找到几条增广路 while(cur_flow=dfs(1,INF)) ans+=cur_flow; } return ans;}int main(){ int i,u,v,w; while(~scanf("%d %d",&m,&n)) { memset(s,0,sizeof(s)); memset(d,0,sizeof(d)); for(i=1;i<=m;i++) { scanf("%d %d %d",&u,&v,&w); if(u==v)continue; s[u][v]+=w; } printf("%d\n",dinic()); } return 0;}

 

简单的模板题...直接最大流撸过

转载于:https://www.cnblogs.com/Felix-F/archive/2012/12/10/3223650.html

你可能感兴趣的文章
linux网络基础
查看>>
Linux命令之rsync
查看>>
linux:NFS网络文件共享服务
查看>>
linux:Inotify事件监控工具
查看>>
http协议原理
查看>>
NOSQL数据库
查看>>
NoSQL数据库之redis持久化存储(一)
查看>>
NOSQL数据库之redis持久化存储(二)
查看>>
python常见异常
查看>>
python基础
查看>>
python:列表和元组
查看>>
python:字符串
查看>>
python:集合
查看>>
python字符编码与转码
查看>>
python:文件操作
查看>>
python:字典
查看>>
python:函数
查看>>
python:模块
查看>>
python:常用模块
查看>>
python:面向对象
查看>>