博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3308 (最大流)
阅读量:6623 次
发布时间:2019-06-25

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

题意:n*m的地图,给出L个火星人登陆的坐标,要在火星人登陆地球的瞬间全部消灭他们,有一种激光枪,一次可以消灭一行(或一列),消灭一行(或一列)有不同的代价,总代价是所有激光枪的代价之积。

思路:之前做过类似的题是求最少多少次能消灭,而最少的次数不一定是代价最小的,行跟列建立二分图,每个火星人就是一条边,就是选一些点覆盖所有的边,这些点的权值之积最小,如果是求和的话就是二分图的最小点权覆盖集了,所以要把求积转化成求和,a*b=log(a)+log(b);求出最小割就可以了。

 

#include
#include
#include
const int N=3000;#define inf 100.0int head[N],num,ans,start,end,gap[N],dis[N];struct edge{ int st,ed,next; double flow;}e[N*100];void addedge(int x,int y,double w){ e[num].st=x;e[num].ed=y;e[num].flow=w;e[num].next=head[x];head[x]=num++; e[num].st=y;e[num].ed=x;e[num].flow=0;e[num].next=head[y];head[y]=num++;}double dfs(int u,double minflow){ if(u==end)return minflow; int i,v; double f,flow=0.0; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].ed; if(e[i].flow>0) { if(dis[v]+1==dis[u]) { f=dfs(v,e[i].flow>minflow-flow?minflow-flow:e[i].flow); flow+=f; e[i].flow-=f; e[i^1].flow+=f; if(minflow-flow<=1e-8)return flow; if(dis[start]>=ans)return flow; } } } if(--gap[dis[u]]==0) dis[start]=ans; dis[u]++; gap[dis[u]]++; return flow;}double isap(){ double maxflow=0.0; memset(gap,0,sizeof(gap)); memset(dis,0,sizeof(dis)); gap[0]=ans; while(dis[start]

 

 

转载地址:http://zjtpo.baihongyu.com/

你可能感兴趣的文章
Oracle RAC安装过程中碰到的“坑”和关键点(一)
查看>>
如何让你的传输更安全——NIO模式和BIO模式实现SSL协议通信
查看>>
【云计算的1024种玩法】使用 NAS 文件储存低价获得好磁盘性能
查看>>
H.264学习笔记之一(层次结构,NAL,SPS)
查看>>
Radware:IP欺诈等让网络攻击难以防范
查看>>
基于Token认证的WebSocket连接
查看>>
【Solidity】2.合约的结构体 - 深入理解Solidity
查看>>
《Drupal实战》——2.6 小结
查看>>
《C语言及程序设计》实践参考——二分法解方程
查看>>
java thread中的wait()和notify()
查看>>
2016最新搜索引擎优化(SEO)重点要素
查看>>
当Web访问性能出现问题,如何深探?
查看>>
【IOS-COCOS2D-X 游戏开发之二】【必看篇】总结阐述COCOS2D-X与COCOS2D-IPHONE区别;
查看>>
eoLinker-API_Shop_通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等...
查看>>
前端面试回忆录 - 滴滴篇 - 凉面
查看>>
jxl导入Excel 切割List 并使用MyBatis批量插入数据库
查看>>
小程序开发总结
查看>>
Tomcat监听器设计思路
查看>>
管理ORACLE实例
查看>>
Confluence 6 MySQL 数据库设置准备
查看>>