/*
最大密集子图子图裸题
解法:设源点s和汇点t
根据胡波涛的<最小割模型在信息学中的应用>
s-每个点,权值为原边权和m,
每个点-t,权值为m+2*g-degree[i],
原来的边u-v ,权值为原权值
最小割f;
flow=m*n-f;
二分g得到flow 逼近0;
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
using namespace std;
#define eps 1e-6
#define inf 0x3fffffff
#define N 110
#define NN 1100
struct node {
int u,v,next;
double w;
}bian[NN*8],f[NN];
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 degree[N];
void build(int m,double mid,int n) {
int i;
init();
for(i=1;i<=n;i++) {
addedge(0,i,m);
addedge(i,0,0);
addedge(i,n+1,1.0*m+2*mid-degree[i]);
addedge(n+1,i,0);
}
for(i=1;i<=m;i++) {
addedge(f[i].u,f[i].v,1);
addedge(f[i].v,f[i].u,1);
}
return ;
}
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 vis[N],ans[N],len;
void dfs1(int u) {
int i;
vis[u]=1;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(!vis[v]&&bian[i].w>0) {
ans[++len]=v;
dfs1(v);
}
}
return ;
}
int cmp(const void *a,const void *b) {
return *(int *)a-*(int *)b;
}
int main() {
int n,m,i,s,t,dd;
double st,en,mid,flow;
while(scanf("%d%d",&n,&m)!=EOF) {
if(!m) {
printf("1\n1\n");
continue;
}
memset(degree,0,sizeof(degree));
for(i=1;i<=m;i++) {
scanf("%d%d",&f[i].u,&f[i].v);
degree[f[i].u]++;
degree[f[i].v]++;
}
s=0;t=n+1;
st=0;en=m;//dd=0;
while(en-st>1.0/n/n) {
mid=(st+en)/2;
// printf("%.2f\n",mid);
// dd++;
// if(dd==12)break;
build(m,mid,n);
flow=dinic(s,t);
// printf("%.2f\n",flow);
flow=1.0*m*n-flow;
if(flow>eps)
st=mid;
else
en=mid;
}
init();
build(m,st,n);
dinic(s,t);
memset(vis,0,sizeof(vis));
len=0;
dfs1(s);
qsort(ans+1,len,sizeof(ans[0]),cmp);
printf("%d\n",len);
for(i=1;i<=len;i++)
printf("%d\n",ans[i]);
}
return 0;}

poj 3155 二分+最小割求实型最小割(最大密集子图)的更多相关文章

  1. zoj 2676 二分+ISAP模板求实型参数的最小割(0-1分数规划问题)(可做ISAP模板)

    /* 参考博文:http://www.cnblogs.com/ylfdrib/archive/2010/09/01/1814478.html 以下题解为转载代码自己写的: zoj2676 胡伯涛论文& ...

  2. zoj 2676 dinic模板求实型最小割(可做dinic模板)

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #inc ...

  3. POJ 3398 Perfect Service(树型动态规划,最小支配集)

    POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...

  4. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  5. 最小割(zjoi2011,bzoj2229)(最小割树)

    小白在图论课上学到了一个新的概念--最小割,下课后小白在笔记本上写下了如下这段话: "对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点\(s,t\)不在同一个部分中,则称 ...

  6. 【bzoj2229】[Zjoi2011]最小割 分治+网络流最小割

    题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...

  7. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

  8. 不同的最小割(cqoi2016,bzoj4519)(最小割树)

    学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点\(s,t\)不在同一个部分中,则称这个划分是关于\(s,t\)的割.对于带权图来说,将 所有顶 ...

  9. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

随机推荐

  1. 《精通css》笔记

    第2章    选择器,注释 1.要知道常用选择器(id选择器,类选择器,类型选择器,后代选择器,伪类选择器(文档结构之外)) 通用选择器(*{    }) 高级选择器(子选择器,相邻同胞选择器,属性选 ...

  2. Tcl介绍和基础语法

    Tcl的背景 Tcl(读作tickle)诞生于80年代的加州大学伯克利分校,作为一种简单高效可移植性好的脚本语言,目前已经广泛应用在几乎所有的EDA工具中.Tcl 的最大特点就是其语法格式极其简单,采 ...

  3. qt project settings被禁用解决方案

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7422707.html qt project settings被禁用点击不了: 解决方案:需要点击该项目(或者项 ...

  4. Angular和SAP C4C的事件处理队列

    Angular 我们在Angular框架的代码里能看到一个名为processQueue的函数: 这个函数是通过$scope.$apply启动的: 核心代码位于一个for循环里,循环体是一个存储异步处理 ...

  5. 浅析HashSet add() 方法存储自定义类型对象的过程

    一.自定义一个Student类 package date0504; public class Student { private String id; Student(String id){ this ...

  6. uva12433 Rent a Car

    init 一开始搞成2*n+2了...囧  所以初始化很重要! 然后提交的时候忘了删调试的数据了..囧 技巧:设立虚拟节点 建图比较麻烦(非常). 要考虑到保养完了的车可以免费再用 设立S,T  ,1 ...

  7. java 定时任务-servlet

    在web.xml中配置监听类. <listener> <listener-class>com.skin.generate.action.TaskManager</list ...

  8. node如何导出数据成为excel格式

    node的应用方式,导出数据 首先,你要把数据库连接上,把你要导的数据表写出来 安装模块 $ npm install sequelize $ npm install mysql $ npm insta ...

  9. luogu P1462 通往奥格瑞玛的道路--spfa+二分答案

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  10. Hash冲突的几种解决方法

    1. 开放定值法: 也叫再散列法,当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突 ...