博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
阅读量:5320 次
发布时间:2019-06-14

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

题目:

心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上...

今天再认真看看,找出几处小错,就A了...

关于题解:

关于最大权闭合子图:

对于这道题,首先,可以01分数规划,于是问题变成二分比值后找最大答案;

把每个格子看做一个点,点之间的边权是格子边上的值*二分的比值,则割掉这条边表示两个点中选一个,那么自然一内一外,它们的交界也就成了封闭路线的边界;

把外围看做还有一圈点,于是边缘的点向汇点连外围边界的值的边;

然后源点向每个点连权值为点(格子)权的边,割这条边表示不要这个点的贡献了;

在这个图上跑最小割,总点权减去最小割就是答案;

注意 ct = 1 !边权要乘二分的比值 k !

代码如下:

#include
#include
#include
#include
#include
#define eps 1e-6#define inf 1e9using namespace std;int const xn=60,xm=3000,xe=5e4;//int n,m,s,t,w[xn][xn],sid[xn][xn][xn][xn],S,T;int dis[xm],hd[xm],ct=1,to[xe],nxt[xe],cur[xm];int e1[xn][xn],e2[xn][xn];double ans,c[xe],sum;queue
q;void add(int x,int y,double z){ to[++ct]=y; nxt[ct]=hd[x]; c[ct]=z; hd[x]=ct; to[++ct]=x; nxt[ct]=hd[y]; c[ct]=0; hd[y]=ct;}int rd(){ int ret=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=0; ch=getchar();} while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return f?ret:-ret;}int id(int x,int y){ return (x-1)*m+y;}int P(int x,int y){ return (x-1)*m+y;}bool bfs(){ while(q.size())q.pop(); memset(dis,0,sizeof dis); dis[s]=1; q.push(s); while(q.size()) { int x=q.front(); q.pop(); for(int i=hd[x],u;i;i=nxt[i]) if(!dis[u=to[i]]&&c[i]>eps)dis[u]=dis[x]+1,q.push(u); } return dis[t];}double dfs(int x,double fl){ if(x==t)return fl; double ret=0; for(int &i=cur[x],u;i;i=nxt[i]) { if(dis[u=to[i]]!=dis[x]+1||c[i]<=eps)continue; double tmp=dfs(u,min(fl-ret,c[i])); if(tmp
eps;}int main(){ n=rd(); m=rd(); s=0; t=n*m+1; double l=0,r=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)w[i][j]=rd(),r+=w[i][j],sum+=w[i][j]; for(int i=1;i<=n+1;i++) for(int j=1;j<=m;j++)sid[i-1][j][i][j]=rd(); for(int i=1;i<=n;i++) for(int j=1;j<=m+1;j++)sid[i][j-1][i][j]=rd(); while(l-r<=eps) { double mid=(l+r)*0.5; if(ck(mid))ans=mid,l=mid+eps; else r=mid-eps; } printf("%.3lf\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/Zinn/p/9715553.html

你可能感兴趣的文章
Ubuntu 12.04 Firefox/Chromium缺少Flash Player问题
查看>>
在线文件管理器elFinder支持中文
查看>>
String比较
查看>>
get the code of function in matlab
查看>>
Django之Models
查看>>
动态添加SqlParameter
查看>>
SQLServer:探讨EXEC与sp_executesql的区别详解
查看>>
NoSuchProviderException异常
查看>>
Spring缓存注解@Cache使用
查看>>
编辑器的选择 西安电子科技大学第二届程序设计新生赛(同步赛)
查看>>
db2 执行报错收集
查看>>
CSS 透明度级别 及 背景透明
查看>>
Linux定时任务(crond)
查看>>
apache编译安装php后需要注意以下配置
查看>>
20)升级登录标志
查看>>
机器学习之GMM-EM
查看>>
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
为MS SQL 2005加入一个用户admin
查看>>
HTML5 LocalStorage 本地存储
查看>>