【POJ3155】Hard Life 分数规划+最小割
2015-06-10 09:35
405 查看
链接:
#include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46437961"); }
题解:
如题。先算出那个分数值,然后看有哪些人还与源点相连。最小割建图:原图每个点对应一个点,原图每条边对应一个点。每条边对应点向两端点对应点连边,注意要单向边。
这道题卡精度:
所以一些细节问题扒代码吧Qwqeps:1e-5
因为是double网络流,所以二分上界别太大,边数就好。
另外这份代码在BZOJ并不能AC、
而在BZOJ能AC的代码也并不一定能在POJ上AC、
什么鬼。
代码:
#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 12000 #define M 70000 #define eps 1e-6 #define inf 0x3f3f3f3f using namespace std; struct ELi { int v,n; double l; }e[M]; int head ,cnt; inline void add(int u,int v,double l) { e[++cnt].v=v; e[cnt].l=l; e[cnt].n=head[u]; head[u]=cnt; } inline void Add(int u,int v,double l) {add(u,v,l),add(v,u,0);} int s,t,dep ; queue<int>q; bool bfs() { while(!q.empty())q.pop(); memset(dep,0,sizeof dep); q.push(s),dep[s]=1; int i,u,v; while(!q.empty()) { u=q.front(),q.pop(); for(i=head[u];i;i=e[i].n) { if(!dep[v=e[i].v]&&e[i].l>eps) { dep[v]=dep[u]+1; if(v==t)return 1; q.push(v); } } } return 0; } double dinic(int x,double flow) { if(x==t)return flow; int i,v; double remain=flow,k; for(i=head[x];i&&remain>eps;i=e[i].n) { if(dep[v=e[i].v]==dep[x]+1&&e[i].l>eps) { k=dinic(v,min(remain,e[i].l)); if(k<eps)dep[v]=0; e[i].l-=k,e[i^1].l+=k; remain-=k; } } return flow-remain; } int U ,V ,n,m; bool check(double mid) { int i; memset(head,0,sizeof head); for(cnt=i=1;i<=m;i++) { Add(n+i,U[i],inf); Add(n+i,V[i],inf); } for(i=1;i<=n;i++)Add(i,t,mid); for(i=1;i<=m;i++)Add(s,n+i,1); double maxflow=m; while(bfs()) maxflow-=dinic(s,inf); return maxflow>eps; } int main() { // freopen("test.in","r",stdin); int i; while(scanf("%d%d",&n,&m)!=EOF) { if(!m) { puts("1\n1"); continue; } s=0,t=n+m+1; for(i=1;i<=m;i++)scanf("%d%d",&U[i],&V[i]); double l=0,r=m,mid; while(l+1e-5<r) { mid=(l+r)/2.0; if(check(mid))l=mid; else r=mid; } check(l),bfs(); int ans=0; for(i=1;i<=n;i++)if(dep[i])ans++; printf("%d\n",ans); for(i=1;i<=n;i++)if(dep[i]) printf("%d\n",i); } return 0; }
相关文章推荐
- Node.js 调试 GC 以及内存暴涨的分析
- 详解JavaScript中getFullYear()方法的使用
- JavaScript中判断函数、变量是否存在
- JavaScript检查手机格式是否错误
- [HTML5]简单网页本地音乐播放器
- Javascript中实现String.startsWith和endsWith方法
- D3js-画二维坐标轴(x轴,y轴)
- 纯css制作三角形
- Javascript中判断对象是否为空
- javascript 清空iframe 支持IE
- 「Offer Sword」Interview 36:数组中的逆序对
- JavaScript判断E-mail地址是否合法
- web前端炫酷实用的HTML5应用和jQuery插件
- javascript事件委托的方式绑定详解
- 2015年最佳的15个 Node.js 开发工具
- JavaScript 自定义对象
- Javascript:谈谈JS的全局变量跟局部变量(转zyz511919766)
- AngularJS入门教程:ng-options
- 浅析JavaScript动画
- 期待已久的2012年度最佳jQuery插件揭晓