求最大密度子图

记得在最后一次寻找的时候记得将进入的边放大那么一点点,这样有利于当每条边都满流的情况下会选择点

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=;
const double eps=0.00000001;
const double INF=*;
vector<int>ans;
struct Dinic
{
struct Edge
{
int from,to;
double cap,flow;
Edge(int cfrom=,int cto=,double ccap=,double cflow=)
{
from=cfrom; to=cto; cap=ccap; flow=cflow;
}
};
int n,m,s,t;
vector<Edge>edges;
vector<int>G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
void init(int n)
{
this->n=n;
m=;
edges.clear();
for(int i=; i<=n; i++)G[i].clear();
}
void AddEdge(int from,int to,double cap)
{
edges.push_back(Edge(from,to,cap,));
edges.push_back(Edge(to,from,,));
m+=;
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS()
{
memset(vis,false,sizeof(vis));
queue<int>Q;
Q.push(s);
d[s]=;
vis[s]=;
while(!Q.empty())
{
int x=Q.front(); Q.pop();
for(int i=; i<G[x].size(); i++)
{
Edge &e =edges[G[x][i]];
if(vis[e.to]==false&&e.cap>e.flow)
{
vis[e.to]=;
d[e.to]=d[x]+;
Q.push(e.to);
}
}
}
return vis[t];
}
double DFS(int x, double a)
{
if(x==t||a==)return a;
double flow=,f;
for(int &i=cur[x]; i<G[x].size(); i++)
{
Edge &e=edges[G[x][i]];
if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
e.flow+=f;
edges[G[x][i]^].flow-=f;
flow+=f;
a-=f;
if(a==)break;
}
}
return flow;
}
double Maxflow(int s,int t)
{
this->s=s; this->t=t;
double flow=;
while(BFS())
{
memset(cur,,sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}
void finde(int x)
{
vis[x]=;
ans.push_back(x);
for(int i=;i<G[x].size(); i++)
{
Edge &e=edges[G[x][i]];
if(vis[e.to]||e.cap<=e.flow)continue;
finde(e.to);
}
}
void solve()
{
memset(vis,false,sizeof(vis));
vis[s]=;
vis[t]=;
for(int i=; i<G[s].size(); i++)
{
Edge &e=edges[G[s][i]];
if(vis[e.to]||e.cap<=e.flow)continue;
finde(e.to);
}
}
}T;
int d[maxn];
int A[],B[];
double U;
void build(int n,int m,double g,int op=)
{
T.init(n+);
for(int i=; i<=n; i++)
{
T.AddEdge(n+,i,U+op*eps*);
T.AddEdge(i,n+,U+g*-d[i]);
}
for(int i=; i<=m; i++)
{
T.AddEdge(A[i],B[i],);
T.AddEdge(B[i],A[i],);
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==)
{
if(m==)
{
printf("1\n1\n");continue;
}
memset(d,,sizeof(d));
for(int i=; i<=m; i++)
{
scanf("%d%d",&A[i],&B[i]);
d[A[i]]++;d[B[i]]++;
}
U=m;
double cL=0.0,cR=1.0*m;
for(int i=; i<; i++)
{
double mid=(cL+cR)/;
build(n,m,mid);
double ans=T.Maxflow(n+,n+);
ans=(U*n-ans)/;
if(ans>) cL=mid;
else cR=mid;
}
build(n,m,cL,);
T.Maxflow(n+,n+);
ans.clear();
T.solve();
sort(ans.begin(),ans.end());
int ge=unique(ans.begin(),ans.end())-ans.begin();
printf("%d\n",ge);
for(int i=; i<ge;i++)
printf("%d\n",ans[i]);
}
return ;
}

poj3155 最大密度子图的更多相关文章

  1. POJ3155 Hard Life [最大密度子图]

      题意:最大密度子图 #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  2. POJ 3155 Hard Life(最大密度子图)

    裸题.输入一个无向图,输出最大密度子图(输出子图结点数和升序编号). 看了<最小割模型在信息学竞赛中的应用——胡伯涛>的一部分,感觉01分数规划问题又是个大坑.暂时还看不懂. 参考http ...

  3. poj 3155 最大密度子图

    思路: 这个还是看的胡伯涛的论文<最小割在信息学竞赛中的应用>.是将最大密度子图问题转化为了01分数规划和最小割问题. 直接上代码: #include <iostream> # ...

  4. POJ 3155 Hard Life 最大密度子图 最大权闭合图 网络流 二分

    http://poj.org/problem?id=3155 最大密度子图和最大权闭合图性质很相近(大概可以这么说吧),一个是取最多的边一个是取最多有正贡献的点,而且都是有选一种必须选另一种的限制,一 ...

  5. bzoj 1312 最大密度子图

    晕,m=0是要输出1(弄的我还找管理员要数据,但明显题意是叫我们输出0呀) 最大密度子图,把边转换成点,然后二分答案,跑最大权闭合子图判定是否可行. #include <cstdio> # ...

  6. 2017 计蒜之道 初赛 第三场 D. 腾讯狼人杀 (点边都带权的最大密度子图)

    点边都带权的最大密度子图,且会有必须选的点. 求\(\frac{\sum w_e}{k*(2n-k)}\)的最大值,其中k为子图点数 设\[h(g) = \sum w_e - g*(2nk-k^2)\ ...

  7. Uvalive 7037 The Problem Needs 3D Arrays(最大密度子图)

    题意:给一段子序列,定义密度:子序列中的逆序对数/子序列的长度 求这个序列的对大密度. 分析:将序列中的每个位置视作点,逆序对\(<i,j>\)之间表示点i与点j之间有一条无向边.所以就转 ...

  8. POJ 3155 Hard Life(最大密度子图+改进算法)

    Hard Life Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 9012   Accepted: 2614 Case Ti ...

  9. Gym - 100548C The Problem Needs 3D Arrays (最大密度子图)

    TK在大多数 Unix平台.Windows平台和Macintosh系统都是预装好的,TKinter 模块是 Tk GUI 套件的标准Python接口.可实现Python的GUI编程. Tkinter模 ...

随机推荐

  1. MATLAB 显示输出数据的三种方式

    MATLAB 显示输出数据的三种方式 ,转载 https://blog.csdn.net/qq_35318838/article/details/78780412 1.改变数据格式 当数据重复再命令行 ...

  2. 解决importerror no module named mysqldb

    在window中 1:在Scripts文件夹下会出现一系列和pip有关的文件,DOS中到Scripts,运行:pip install mysql-python 2:报错:Microsoft Visua ...

  3. xgboost原理

    出处http://blog.csdn.net/a819825294 1.序 距离上一次编辑将近10个月,幸得爱可可老师(微博)推荐,访问量陡增.最近毕业论文与xgboost相关,于是重新写一下这篇文章 ...

  4. mysql中的事物处理

    首先,事物的概念,保证一组sql语句操作的完整性,在这个过程中要充分考虑到多用户同时访问数据库数据的情况. 关键词有COMMIT,ROLLBACK,,START TRANSACTION

  5. python3 小工具

    扫描IP的端口是否开放:Porttest.py # -*- coding: utf-8 -*- import sys import os import socket #扫描 def scanport( ...

  6. adb 常用命名

    adb是Android Debug Bridge的简称, 就是起到调试桥的作用,用来操作android设备 adb help (显示帮助信息) adb devices (获取设备列表及设备状态) ad ...

  7. poj2109 【贪心】

    Current work in cryptography involves (among other things) large prime numbers and computing powers ...

  8. java学习(一)--- 基础语法

    学习内容来 自菜鸟教程 http://www.runoob.com/java/java-object-classes.html   Java基础 Java:一个Java程序可以认为是一系列的对象组合, ...

  9. 关于vue执行打包后,如何在本地浏览问题

    最近一个人在捣鼓vue,写完项目后发现在npm run dev下可以正常访问,bulid之后却一片空白,查看console出现许多Failed to load resource: net::ERR_F ...

  10. Codeforces 706C - Hard problem - [DP]

    题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...