最大流Dinic C语言实现(详细)--poj 3281

2024-01-08 06:32

本文主要是介绍最大流Dinic C语言实现(详细)--poj 3281,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//Dinic最大的不同就是分层找增长路径。。。,
//我们知道一般是用BFS来找一个增长路径,从中心一层一层地向外扩散
//但是Dinic也是一层一层的向外找,但是它每层只选择一个一个顶点就跳到下一层中接着寻找
#include<stdio.h>
#define N 1000
#define MAX 0x3f3f3f3f
#define min(x,y) ((x>y)?(y):(x))//定义宏
int map[N][N];//图
int dis[N];//来表示分层图距离
int q[10000],h,r;//手工队列,h为队首,r为队尾
int source,sink;//顶点的最大编号sink,最小编号source=0
int BFS(void)
{int i,j;memset(dis,0xff,sizeof(dis));dis[0]=0;h=-1;r=0;q[0]=0;while(h<r){j=q[++h];for(i=0;i<=sink;i++){if(dis[i]<0&&map[j][i]>0){dis[i]=dis[j]+1;//来决定每个点与源点的距离,也就是分层。。。q[++r]=i;}}}if(dis[sink]>0)return 1;elsereturn 0;
}
int find(int x,int low)//表示已经到了x顶点,并且此时从源点到x顶点的这一段路中可以达到的最大流量
{int i,a=0;if(x==sink)//如果到了汇点,返回最大流量return low;for(i=0;i<=sink;i++){if(map[x][i]>0&&dis[i]==dis[x]+1&&(a=find(i,min(low,map[x][i]))))//这就是每一层找一个,然后接着找下一层{map[x][i]-=a;//正向边流量增加map[i][x]+=a;//反向边流量减少return a;}}return 0;
}
int main()
{int ans,tans,n,f,d,i,f_sum,d_sum,j,tmp;while(~scanf("%d%d%d",&n,&f,&d)){memset(map,0,sizeof(map));source=0;sink=2*n+f+d+1;for(i=1;i<=f;i++)map[source][i]=1;//构建图,这道题有点特殊的构图方式for(i=1;i<=d;i++)map[2*n+f+i][sink]=1;for(i=1;i<=n;i++)map[f+i][f+n+i]=1;for(i=1;i<=n;i++){scanf("%d%d",&f_sum,&d_sum);for(j=1;j<=f_sum;j++){scanf("%d",&tmp);map[tmp][f+i]=1;}for(j=1;j<=d_sum;j++){scanf("%d",&tmp);map[f+n+i][2*n+f+tmp]=1;}}ans=0;while(BFS()){while(tans=find(0,0x3f3f3f3f))ans+=tans;}printf("%d\n",ans);}
}
//还有一种实现方式,这是从汇点开始到源点结束的。。。。。
#define MAXV 410
#define INF INT_MAX
#define min(a,b) (a>b?b:a)
int res[MAXV][MAXV];		
int	dis[MAXV];			
int n,maxflow;	
int bfs(){int k;queue<int> q;memset(dis,-1,sizeof(dis));dis[n]=0;q.push(n);while(!q.empty()){k=q.front();q.pop();for(int i=0;i<n;i++){if(dis[i]==-1 && res[i][k]){dis[i] = dis[k] + 1;q.push(i);}}if(k==0) return 1;}return 0;
}int dfs(int cur,int cp){if(cur==n)	return cp;int tmp=cp,t;for(int i=0;i<=n && tmp;i++){if(dis[i]+1==dis[cur] && res[cur][i]){t=dfs(i,min(res[cur][i],tmp));res[cur][i]-=t;res[i][cur]+=t;tmp-=t;}}return cp-tmp;
}


这篇关于最大流Dinic C语言实现(详细)--poj 3281的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582563

相关文章

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的