zoj 2676 dinic模板求实型最小割(可做dinic模板)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
using namespace std;
#define eps 1e-6
#define inf 0x3fffffff
#define N 410
struct node
{
int u,v,next;
double w;
}bian[N*4],f[N];
int yong,head[N],dis[N],work[N];
void init()
{
yong=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,double w)
{
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
int bfs(int S,int T)
{
queue<int>q;
memset(dis,-1,sizeof(dis));
dis[S]=0;
q.push(S);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=bian[i].next)
{
int v=bian[i].v;
if(bian[i].w>0&&dis[v]==-1)
{
dis[v]=dis[u]+1;
if(v==T)
return 1;
q.push(v);
}
}
}
return 0;
}
double dfs(int S,double a,int T)
{
if(S==T)return a;
for(int &i=work[S];i!=-1;i=bian[i].next)
{
int v=bian[i].v;
if(bian[i].w>0&&dis[v]==dis[S]+1)
{
double tt=dfs(v,min(a,bian[i].w),T);
if(tt>0)
{
bian[i].w-=tt;
bian[i^1].w+=tt;
return tt;
}
}
}
return 0;
}
double Dinic(int S,int T)
{
double ans=0;
while(bfs(S,T))
{
memcpy(work,head,sizeof(head));
while(1) {
double tt=dfs(S,inf,T);//割出来的可能是负值
if(tt<eps)break;
ans+=tt;
}
}
return ans;
}
int a[N],len,vis[N];
void dfss(int u) {
int i;
// printf("%d\n",u);
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(bian[i].w>eps&&!vis[v]) {
vis[v]=1;
dfss(v);
}
}
}
int main()
{
int n,m,i;
double st,en,mid,flow;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1; i<=m; i++)
scanf("%d%d%lf",&f[i].u,&f[i].v,&f[i].w);
st=0;
en=10000001;
while(st<en+eps)
{
mid=(st+en)/2;
init();
flow=0;
for(i=1; i<=m; i++)
{
// printf("%.2f %.2f\n",f[i].w,mid);
if(f[i].w<mid+eps)
flow=flow+f[i].w-mid;
else
{
addedge(f[i].u,f[i].v,f[i].w-mid);
addedge(f[i].v,f[i].u,f[i].w-mid);
}
}
double k=Dinic(1,n);
flow+=k;
// printf("%.2f\n",k);
if(flow>eps)
st=mid+eps;
else
en=mid-eps;
}
// printf("mid=%.10f\n",mid);
memset(vis,0,sizeof(vis));
vis[1]=1;
dfss(1);
len=0;
for(i=1;i<=m;i++) {
// printf("%.10f %.10f\n",f[i].w,mid+eps);//&&vis[f[i].u]+vis[f[i].v]==1
if(vis[f[i].u]+vis[f[i].v]==1||f[i].w<eps+mid)
len++;
}
printf("%d\n",len);
int ok=0;
for(i=1;i<=m;i++)
if(vis[f[i].u]+vis[f[i].v]==1||f[i].w<mid+eps) {
if(ok)
printf(" ");
printf("%d",i);
ok=1;
}
printf("\n");
}
return 0;
}
zoj 2676 dinic模板求实型最小割(可做dinic模板)的更多相关文章
- poj  3155  二分+最小割求实型最小割(最大密集子图)
		/* 最大密集子图子图裸题 解法:设源点s和汇点t 根据胡波涛的<最小割模型在信息学中的应用> s-每个点,权值为原边权和m, 每个点-t,权值为m+2*g-degree[i], 原来的边 ... 
- zoj  2676  二分+ISAP模板求实型参数的最小割(0-1分数规划问题)(可做ISAP模板)
		/* 参考博文:http://www.cnblogs.com/ylfdrib/archive/2010/09/01/1814478.html 以下题解为转载代码自己写的: zoj2676 胡伯涛论文& ... 
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
		1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ... 
- zoj 2874 & poj 3308 Paratroopers (最小割)
		意甲冠军: 一m*n该网络的规模格.详细地点称为伞兵着陆(行和列). 现在,在一排(或列) 安装激光枪,激光枪可以杀死线(或塔)所有伞兵.在第一i安装一排 费用是Ri.在第i列安装的费用是Ci. 要安 ... 
- 【最短路】【spfa】【最小割】【Dinic】bzoj1266 [AHOI2006]上学路线route
		原问题等价于断掉一些边,让原来所有的最短路全都无法联通S和T. 先求最短路,然后把在最短路上的边(dis[u[i]]+w[i]==dis[v[i]])加入新图里,跑最小割.显然. 注意是无向图. #i ... 
- HDU 3046 Pleasant sheep and big wolf(最小割最大流+Dinic)
		http://acm.hdu.edu.cn/showproblem.php?pid=3046 题意: 给出矩阵地图和羊和狼的位置,求至少需要建多少栅栏,使得狼不能到达羊. 思路:狼和羊不能到达,最小割 ... 
- 【最小割】【Dinic】HihoCoder - 1252 - The 2015 ACM-ICPC Asia Beijing Regional Contest - D - Kejin Game
		题意:有一个技能学习表,是一个DAG,要想正常学习到技能x,要将指向x的技能全部先学到,然后会有一个正常花费cx.然后你还有一种方案,通过氪金dx直接获得技能x.你还可以通过一定的代价,切断一条边.问 ... 
- 【最小割】【Dinic】Gym - 101201G - Maximum Islands
		题意:方格内有些位置是水域,有些位置是陆地,有些位置是被云彩遮挡住了:让你自己规定被云彩遮挡住的地方是陆地还是水域,使得陆地个数最多.(均为四连通块) 显然与陆地邻接的云彩填成水比较优.其他云彩格子填 ... 
- 【最小割】【Dinic】bzoj3275 Number
		每个点拆点,分别向源/汇连a[i]的边,满足条件的相互连INF的边,答案为sum-maxflow*2. 因为若有几个点不能同时被选,我们要贪心地选择其中和尽量大的部分,这可以由最小割来保证. #inc ... 
随机推荐
- 最简单的struts实例介绍
			struts2环境配置 struts2框架,大多数框架都在使用.由于工作需要,开始做Java项目.先学个struts2. 一.下载struts2 有好多版本,我下载的是struts-2.2.1.1 ... 
- (二)Spring容器
			大佬总结的很好,请去看大佬博客. http://www.cnblogs.com/chenssy/archive/2012/11/15/2772287.html https://www.cnblogs. ... 
- [SPOJ1812]Longest Common Substring II 后缀自动机 多个串的最长公共子串
			题目链接:http://www.spoj.com/problems/LCS2/ 其实两个串的LCS会了,多个串的LCS也就差不多了. 我们先用一个串建立后缀自动机,然后其它的串在上面跑.跑的时候算出每 ... 
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
			题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ... 
- OpenGl之旅-—初识opengl
			昨天学习了如何使用codeblocks来编译运行一个opengl的项目.在创建一个新的opengl项目时他默认已经写了一个示例,今天我们就上面的例子进行下代码的剖析,以此来敲开opengl的神秘大门. ... 
- Python学习 Day 8 继承 多态 Type isinstance dir __slots__
			继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ... 
- (转) 淘淘商城系列——使用FastDFS-Client客户端进行上传图片的测试
			http://blog.csdn.net/yerenyuan_pku/article/details/72804018 不久之前,我们实现了商品的类目选择这个功能,但这只是万里长征的第一步,我们还有很 ... 
- git的使用 及一些常见的错误处理
			git安装使用 添加文件到Git仓库,分两步: 1.使用命令git add <file>,注意,可反复多次使用,添加多个文件: 2.使用命令git commit -m <messag ... 
- 循环冗余校验(CRC)算法入门
			http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ... 
- SQL Server错误: 0 解决方案
			1.已设置两种登录模式. 2.SQL Server配置管理器已配置好. 按Windows徽标键+R组合键,然后输入cmd. 再然后输入netsh winsock reset.接下来重启电脑,应该就可以 ... 
