/*
最大密集子图子图裸题
解法:设源点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. rhel7使用centos7yum组件

    1)rpm -qa|grep yum --查看已安装的yum组件包 2)rpm -e 包名 --nodeps --卸载包 3)下载安装以下组件包: 使用rpm -ivh yum-* yum-3.4.3 ...

  2. 项目适配iOS9遇到的一些问题及解决办法 ,以及URL 白名单配置方法

    1.网络请求报错.升级Xcode 7.0发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Secur ...

  3. sqlserver:查询锁住sql以及解锁

    --查看被锁表:SELECT request_session_id spid, OBJECT_NAME( resource_associated_entity_id ) tableNameFROM s ...

  4. 在windows上安装Jenkins---tomcat流

    在windows上安装Jenkins有两种方式: (1)jar流 在命令行中运行:java -jar jenkins.war 浏览器访问 localhost:8080,创建初始管理员帐号即可. (2) ...

  5. pickle 两个使用小方法

    def pickle_load(file_path): f = open(file_path,'r+') data = pickle.load(f) f.close() return data     ...

  6. Python——集合与字典练习

    集合与字典练习question1问题描述:有一个列表,其中包括 10 个元素,例如这个列表是[1,2,3,4,5,6,7,8,9,0],要求将列表中的每个元素一次向前移动一个位置,第一个元素到列表的最 ...

  7. exportfs - 管理NFS共享文件系统列表

    概述 (SYNOPSIS) /usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..] /usr/sbin/exportfs -r [-v] ...

  8. Vickers Vane Pump - Hydraulic Vane Pump Failure: Cavitation, Mechanical Damage

    One of our readers recently wrote to me about the following questions: “Recently, we purchased a sec ...

  9. Java集合系列之HashMap

    概要 第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Clo ...

  10. error: version in "./docker-compose.yml" is unsupported

    #sudo rm /usr/bin/docker-compose #curl -L https://github.com/docker/compose/releases/download/1.20.0 ...