当前位置: 首页 > news >正文

UVA1389 Hard Life

UVA1389 Hard Life

大意

求最大密度子图。

思路

对于这个题,我们要求 \(\dfrac{|E|}{|V|}\) 的值尽可能的大,我们将其变形一下, \(\dfrac{|E|}{|V|} \ge g\),那么我们设 \(h(g) = |E| - g|V|\),那么我们如果 \(h(g) \ge 0\) 就说明我们可以有更大的密度 \(g\)

对于一条边来说,选它的贡献是 \(1\),对于一个点来说,选其的代价是 \(g\)。由于选边必选点,我们将其转化为最大权闭合图来处理。

  • 源点 \(S\) \(\rightarrow\) 边点 \(e_i\):容量为 \(1\)(表示这条边的潜在收益)。
  • \(v_j\) \(\rightarrow\) 汇点 \(T\):容量为 \(g\)(表示选这个点的成本)。
  • 边点 \(e_i\) \(\rightarrow\) 端点 \(u, v\):容量为 \(\infty\)(表示这种依赖关系不可割断)。

所以我们的 \(h(g) = 边权数 - 最小割\)

我们尝试二分答案,只需要找到使得 \(h(g) = 0\) 的最小的 \(g\) 即可。

那么二分答案的精度呢?

一般来说下届直接用 \(0\),上界就 \(m\),毕竟只有 \(m\) 条边,那么对于两个子图的密度精度:

\[\dfrac{m_1}{n_1} - \dfrac{m_2}{n_2} = \dfrac{m_1n_2 - m_2n_1}{n_1n_2} \ge \dfrac{1}{n_1n_2} \ge \dfrac{1}{n ^ 2} \]

那么显然的事情是,我们把 \(\dfrac{1}{n ^ 2}\) 定为精度即可,也可以再乘 \(0.1\),看习惯吧。

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 1200;
const int MAXM = 20000;
const double eps = 1e-9;struct Edge {int v, nxt;double c;
} e[MAXM];int h[MAXN], cur[MAXN], d[MAXN], cnt;
int n, m, S, T;
int U[MAXM], V[MAXM];void add(int u, int v, double c){e[cnt] = {v, h[u], c}; h[u] = cnt++;e[cnt] = {u, h[v], 0}; h[v] = cnt++;
}bool bfs(){queue<int> q;memset(d, -1, sizeof(d));d[S] = 0;q.push(S);while(!q.empty()){int u = q.front();q.pop();for(int i = h[u];~i;i = e[i].nxt){int v = e[i].v;if(e[i].c > eps && d[v] == -1){d[v] = d[u] + 1;q.push(v);}}}return (d[T] == -1) ? false : true;
}double dfs(int u, double flow){if(u == T || flow < eps){return flow;}double res = 0;for(int &i = cur[u];~i;i = e[i].nxt){int v = e[i].v;if(e[i].c > eps && d[v] == d[u] + 1){double tmp = dfs(v, min(flow, e[i].c));if(tmp > eps){e[i].c -= tmp;e[i ^ 1].c += tmp;res += tmp;flow -= tmp;if(flow < eps) break;}}}if(res < eps){d[u] = -1;}return res;
}double Dinic(){double res = 0;while(bfs()){memcpy(cur, h, sizeof(h));res += dfs(S, 1e9);}return res;
}bool check(double g){cnt = 0;memset(h, -1, sizeof(h));S = 0, T = n + m + 1;for(int i = 1;i <= m;i ++){add(S, n + i, 1.0);add(n + i, U[i], 1e9);add(n + i, V[i], 1e9);}for(int i = 1;i <= n;i ++){add(i, T, g);}return (double)m - Dinic() > eps;
}int main(){while(cin >> n >> m){if(m == 0){cout << 1 << endl << 1 << endl;continue;}for(int i = 1;i <= m;i ++) cin >> U[i] >> V[i];double L = 0, R = m;for(int i = 0;i < 60;i ++){double mid = (L + R) / 2.0;if(check(mid)) L = mid;else R = mid;}check(L);vector<int> ans;for(int i = 1;i <= n;i ++){if(d[i] != -1) ans.push_back(i);}cout << ans.size() << endl;for(int i = 0;i < ans.size();i ++) cout << ans[i] << endl;}return 0;
}
http://www.jsqmd.com/news/384426/

相关文章:

  • AI工具泛滥?给你一个清晰的学习优先级排序
  • 《实时渲染》第3章-图形处理单元-3.5顶点着色器
  • 2026年市面上专业的升降机公司排名,自行走升降机/装卸平台/防爆升降平台/液压升降机/装车平台,升降机工厂如何选 - 品牌推荐师
  • 给老板看的AI能力证明:不止是证书,这3个成果更有效
  • 2026年正规的上海GEO品牌/上海GEO推广综合推荐公司 - 品牌宣传支持者
  • 2026年市面上评价高的安检门生产厂家哪家好,安检仪/金属探测门/智能安检/安检门/安检设备,安检门源头厂家找哪家 - 品牌推荐师
  • 2026年正规的常熟GEO推广/常熟GEO优化市场口碑推荐公司 - 品牌宣传支持者
  • 2026有哪些口碑好的大件物流厂家?一文知晓,大件运输/大件物流,大件物流公司排行 - 品牌推荐师
  • 2026年靠谱的张家港GEO网站/张家港GEO营销行业参考推荐公司 - 品牌宣传支持者
  • 何友院士《人工智能发展前沿》全景解读:从理论基石到产业变革 - 实践
  • G120C自由报文999编程案例:可复用的变频器控制秘籍
  • 2026年正规的太仓GEO网站/太仓GEO优化用户认可推荐公司 - 品牌宣传支持者
  • 2026年靠谱的张家港网站设计/张家港做网站优选服务推荐企业 - 品牌宣传支持者
  • 2026年靠谱的常熟官网建设/常熟外贸网站经验丰富推荐企业 - 品牌宣传支持者
  • doubaoAD.com是做什么的公司? - 品牌2025
  • node PM2 常用命令使用
  • 新手也能上手 10个降AIGC平台测评:专科生降AI率必备攻略
  • node js 性能处理
  • Springboot3+vue3实现增删改查、分页查询、批量删除(下)
  • 给你一张清单 10个降AI率平台测评对比 继续教育必备工具推荐
  • 2026年正规的太仓做网站/太仓网站推广优质推荐汇总公司 - 品牌宣传支持者
  • Spring组件扫描原理解析
  • 2026年推荐上海网站推广/上海网站建设行业参考推荐公司 - 品牌宣传支持者
  • 2026年比较好的无添加海鲜干货/海鲜干货鱿鱼干热门必买清单 - 品牌宣传支持者
  • 2026年质量好的汽车用品硅胶包胶/奶瓶硅胶包胶优质厂商精选推荐(口碑) - 品牌宣传支持者
  • 2026年靠谱的苏州网站设计/苏州做网站企业服务推荐公司 - 品牌宣传支持者
  • 基于西门子 S7 - 200 PLC 齿轮研磨专用机床的液压系统及液压缸设计探索
  • 从此告别拖延,AI论文网站 千笔·专业论文写作工具 VS 文途AI
  • 计算机软件资格考试—Python补充
  • 2026年比较好的轨道交通座椅调角器/扶手调角器行业内口碑厂家推荐 - 品牌宣传支持者