UVa1389/LA3709 Hard Life

news2024/9/25 11:11:30

UVa1389/LA3709 Hard Life

  • 题目链接
  • 题意
    • 输入格式
    • 输出格式
  • 分析
  • AC 代码

题目链接

  本题是2006年icpc欧洲区域赛东北欧赛区的H题

题意

  约翰是一家公司的CEO。公司的股东决定让他的儿子斯科特成为公司的经理。约翰十分担心,儿子会因为在经理岗位上表现优异而威胁到他CEO的位置。因此,他决定精心挑选儿子要管理的团队人员,让儿子知道社会的险恶。已知公司中一共有n(1≤n≤100)名员工,员工之间共有m(0≤m≤1000)对两两矛盾关系。如果将一对有矛盾的员工安排在同一个团队,那么团队的管理难度就会增大。一个团队的管理难度系数等于团队中的矛盾关系对数除以团队总人数。团队的管理难度系数越大,团队就越难管理。约翰希望给儿子安排的团队的管理难度系数尽可能大。
Hard Life
  以上图为例,管理难度系数最大的团队由1,2,4,5号员工组成,他们4人中共有5对矛盾关系,所以管理难度系数为5/4。如果将3号员工也加入到团队之中,那么管理难度系数就会降至6/5。

输入格式

  第一行包含两个整数n和m。接下来m行,每行包含两个整数 a i a_i ai b i b_i bi,表示员工 a i a_i ai b i b_i bi之间存在矛盾。所有员工编号从 1 到 n。每个矛盾对最多在输入中出现一次,且介绍矛盾对时,员工介绍顺序是随意的。

输出格式

  首先输出一个整数 k,表示安排给斯科特的团队人员数量。接下来 k 行,以升序输出团队每个成员的编号,每行一个。如果答案不唯一,则输出任意一种即可。
  注意:至少要选择一名员工。

分析

  最大密度子图,相关概念和求解算法详细的分析参考以下两个博客:
  【学习笔记】最大密度子图
  最大密度子图的相关概念

  最大密度子图是一种分数规划问题,需要用二分法求解。二分找零点的过程需要建图求最小割,可以转化为最大权闭合子图来求,不过有更好的办法:对原图的边 ( u , v ) (u,v) (u,v) u u u v v v连一条容量为1的边(反向边容量也是1);源点 s s s向每个结点 x x x连容量为 m m m(原图边数)的有向边;结点 x x x向汇点 t t t连容量为 2 λ − d x + m 2\lambda-d_x+m 2λdx+m的边。
   c ( u , v ) = 1 c ( s , x ) = m c ( x , t ) = 2 λ − d x + m \displaystyle \begin{aligned} c(u,v)&=1\\ c(s,x)&=m\\ c(x,t)&=2\lambda-d_x+m \end{aligned} c(u,v)c(s,x)c(x,t)=1=m=2λdx+m

  注意:由于二分过程中 λ \lambda λ是小数,建图时边的容量和流量要定义成double;任意两个子图的密度差不小于 1 n 2 \frac{1}{n^2} n21,因此可将 l + e p s < r l+eps<r l+eps<r e p s eps eps赋值为 1 n 2 \frac{1}{n^2} n21

  如果要输出方案,根据所采用的最大流算法求出S点集和T点集,S点集去掉源点就是最大密度子图的点集V,进一步如果要输出边就是那些两个端点都在V中的边。

AC 代码

#include <iostream>
#include <cstring>
using namespace std;

#define M 2440
#define N 110
struct edge {int u, v; double cap, flow;} e[M];
int g[N][M>>1], q[N], p[N], d[N], cur[N], num[N+1], cnt[N], deg[N], c, m, n, kase = 0; bool vis[N];

void add_edge(int u, int v, double cap, double cc = 0.) {
    e[c] = {u, v, cap, 0}; g[u][cnt[u]++] = c++; e[c] = {v, u, cc, 0}; g[v][cnt[v]++] = c++;
}

bool bfs(int s, int t) {
    memset(vis, 0, sizeof(vis)); q[0] = t; d[t] = 0; vis[t] = true;
    int head = 0, tail = 1;
    while (head < tail) {
        int v = q[head++];
        for (int i=0; i<cnt[v]; ++i) {
            const edge& ee = e[g[v][i]^1];
            if (!vis[ee.u] && ee.cap > ee.flow) vis[ee.u] = true, d[ee.u] = d[v] + 1, q[tail++] = ee.u;
        }
    }
    return vis[s];
}

double max_flow(int s, int t, double x) {
    double flow = 0.;
    for (int i=0; i<c; ++i) e[i].flow = 0.;
    for (int i=0; i<cnt[t]; ++i) {
        edge &ee = e[g[t][i]^1];
        ee.cap = 2.*x + m - deg[ee.u];
    }
    for (int i=0; i<=t; ++i) d[i] = t+1;
    if (!bfs(s, t)) return 0.;
    memset(num, 0, sizeof(num)); memset(cur, 0, sizeof(cur));
    for (int i=0; i<=t; ++i) ++num[d[i]];
    for (int u=s; d[s] <= t;) {
        if (u == t) {
            double a = 1e30;
            for (int v=t; v!=s; v = e[p[v]].u) a = min(a, e[p[v]].cap - e[p[v]].flow);
            for (int v=t; v!=s; v = e[p[v]].u) e[p[v]].flow += a, e[p[v]^1].flow -= a;
            flow += a; u = s;
        }
        bool ok = false;
        for (int i=cur[u]; i<cnt[u]; ++i) {
            const edge& ee = e[g[u][i]];
            if (ee.cap > ee.flow && d[u] == d[ee.v] + 1) {
                ok = true; p[ee.v] = g[u][i]; cur[u] = i; u = ee.v;
                break;
            }
        }
        if (!ok) {
            int m = t;
            for (int i=0; i<cnt[u]; ++i) {
                const edge& ee = e[g[u][i]];
                if (ee.cap > ee.flow) m = min(m, d[ee.v]);
            }
            if (--num[d[u]] == 0) break;
            ++num[d[u] = m + 1]; cur[u] = 0;
            if (u != s) u = e[p[u]].u;
        }
    }
    return flow;
}

void solve() {
    if (kase++) cout << endl;
    int s = 0, t = n+1, cc = 0; memset(cnt, c = 0, sizeof(cnt)); memset(deg, 0, sizeof(deg));
    for (int i=0; i<m; ++i) {
        int u, v; cin >> u >> v; ++deg[u]; ++deg[v]; add_edge(u, v, 1, 1);
    }
    for (int i=1; i<=n; ++i) add_edge(s, i, m), add_edge(i, t, m);
    double l = 0., r = m, eps = 1./n/n, f = m*n;
    while (l+eps < r) {
        double x = .5*(l+r);
        max_flow(s, t, x) < f ? l = x : r = x;
    }
    max_flow(s, t, l);
    bfs(s, t);
    for (int i=1; i<=n; ++i) if (!vis[i]) ++cc;
    cout << cc << endl;
    for (int i=1; i<=n; ++i) if (!vis[i]) {
        cout << i << endl;
        if (--cc == 0) return;
    }
}

int main() {
    while (cin >> n >> m) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPv4地址学习

今天学习了IPv4&#xff0c;做下学习笔记&#xff1a; 什么是IPv4&#xff1f; IPv4地址是网络层地址&#xff0c;用于标识网络中的每个节点。 什么是子网&#xff1f;什么是主类子网划分&#xff1f; 我们将IP地址划分为网络位和主机位 一个地址为192.168.1.2/24&#xff…

【HTML】置换元素(替换元素)

● 它的内容不是由元素的标签内的内容决定的,而是由元素的属性决定的 ● 可以通过CSS设置宽度和高度。 常见的置换元素主要包括以下几种: <img> 元素:用于嵌入图像,通过 src 属性指定图像的路径。例如:<img src="example.jpg" alt="示例图片&quo…

场景感知技术带您重塑未来生活的新篇章

在科技日新月异的今天&#xff0c;场景感知技术正以前所未有的速度渗透到我们生活的方方面面&#xff0c;成为连接物理世界与数字世界的桥梁&#xff0c;重塑着人类的认知方式与生活体验。这项技术通过综合运用传感器、大数据分析、人工智能等前沿科技&#xff0c;实现对周围环…

C++多态 学习笔记(上)

本文涉及的指针都是 4bytes 。 如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是 x64 程序&#xff0c;则需要考虑指针是 8bytes 问题 等等。 什么是多态&#xff1f; 举个例子&#xff1a;比如 买票这个行为 &#xff0c;当 普通人 买票时&#xff0c;…

短剧APP系统搭建,短剧市场的发展机遇

短剧作为近几年内发展快速的行业&#xff0c;一直深受大众的欢迎&#xff0c;各种让观众上头的短剧层出不穷&#xff0c;深深吸引着大众。短剧的巨大发展前景也吸引了大量资本涌入市场&#xff0c;目前&#xff0c;短剧入局者也都获得了不菲的经济收益&#xff01; 随着短剧行…

C++下标+【】、迭代器、范围for、迭代器对于其他容器都是通用的、迭代器可以更好的跟算法配合、rbegin和rend函数、const修饰的迭代器等的介绍

文章目录 前言一、 下标 【】二、 迭代器1.begin2. end3. 使用迭代器遍历string类对象 三、范围for(语法糖)五、迭代器对于其他容器都是通用的六、迭代器可以更好地跟算法配合七、 rbegin 和 rend函数八、 const 修饰的迭代器总结 前言 C下标【】、迭代器、范围for、迭代器对…

JavaEE---Spring MVC(5)

MVC学习小案例3 留言板案例 后端代码 测试 点击刷新的时候页面的这些记录仍在 一个小tips 我们在日常中写的时候会经常写到get和set方法,这会使整个代码看起来非常多不好看,这里我们引入一个新的依赖解决这个问题 引入LomBok依赖 那要是个别情况下我们不想获取他的ge…

高集成度双通道差分式电容型传感芯片-MC11

工采电子代理的MC11S、MC11T是一款高集成度双通道电容型传感芯片&#xff0c;芯片直接与被测物附近的差分电容极板相连&#xff0c;通过谐振激励并解算测量微小电容的变化。激励频率在0.1~20MHz范围内可配置&#xff0c;其频率测量输出为16bit数字信号&#xff0c;对应的电容感…

Ventoy启动盘制作

然后直接将系统的ISO镜像直接拷贝进去&#xff0c;就能直接使用

69页PPT全面预算管理体系的框架与落地

一、明确企业战略目标企业战略目标是预算指标体系确立的根本出发点。它为预算指标的设定提供了方向和指导。 深入分析企业长期发展规划 企业需要对自身的长期发展规划进行全面、深入的分析。这包括对市场趋势、行业竞争态势、技术发展方向等外部环境因素的研究&#xff0c;以…

AI技术颠覆游戏开发:谷歌DeepMind GameNGen实时生成《DOOM》探秘

引言 近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在图像和视频生成领域取得了巨大突破。然而&#xff0c;谁能想到&#xff0c;这项技术正逐渐渗透进游戏开发领域&#xff0c;且潜力巨大。2023年8月29日&#xff0c;谷歌DeepMind发布了名为《扩散模型是实时…

【舍入,取整,取小数,取余数丨Excel 函数】

数学函数 1、Round函数 Roundup函数 Rounddown函数 取整&#xff1a;(Int /Trunc)其他舍入函数&#xff1a; 2、Mod函数用Mod函数提取小数用Mod函数 分奇偶通过身份证号码判断性别 1、Round函数 Roundup函数 Rounddown函数 Round(数字&#xff0c;保留几位小数)&#xff08;四…

解除网站禁用右键 解除禁用选择方法 并允许复制

限制我复制&#xff0c;太恶心了&#xff0c;别用技术作恶&#xff01;&#xff01;&#xff01; 一般HTML网站禁止右键选择的方法 <body ondragstart"return false" oncontextmenu"return false" onselectstart"return false">解除网站…

遇到“msvcp120.dll丢失”的错误提示?来看看msvcp120.dll丢失的解决方法都有哪些?

遇到“msvcp120.dll丢失”的错误提示可能会让人感到焦虑&#xff0c;尤其是当你尝试运行某个应用程序或游戏时突然接收到这样的消息。​msvcp120.dll​是Microsoft Visual C 2013 Redistributable Package 中的一个文件&#xff0c;主要负责C标准库中的功能&#xff0c;比如输入…

C++第四十六弹---解锁多线程编程的奥秘:<thread>库深入探索

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 线程库 1.1 thread类的简单介绍 1.2 线程函数参数 1.3 原子性操作库(atomic) 1.4 lock_guard与unique_lock 1.4.1 mutex的种类 1.4.2 loc…

python-小理的三角形

题目描述 小理有一个数组长度大小为 n &#xff0c;数组中有 n 个正整数。 现在小理请你从其中选出三个元素&#xff08;注意选择元素的下标不能相同&#xff0c;但是其值可以相同&#xff09;组成一个三角形。 无法做到&#xff0c;请输出一行一个字符串"No solution&quo…

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu&#xff0c;记录的是每年录取学生的人数及录取学生的学制&#xff0c;计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,…

【平渊网络】副业项目拆解:视频借鉴式搬运项目 | 搞笑视频跨平台 “借鉴式” 搬运项目思路 | 抖音防查重机制基础

目录 项目介绍 实操&#xff1a;账号准备 素材制作教学 防查重机制基础 项目介绍 只分享实操干货&#xff0c;不浪费时间。如果你没有2台手机&#xff0c;或者手机不支持分身就不用往下读了&#xff0c;这个项目大概率是做不出流量的。 项目是情感聊天对话的变种&#xff…

C++ DLL DEMO

头文件dlltest.h #pragma once #include "pch.h" #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <bitset>extern "C" __declspec(dllexport) void debugService(uint32_t debugF…

【全网最全】2024年数学建模国赛B题31页完整建模过程+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 2024数学建模国赛B题 【全网最全】2024年数学建模国赛B题31页完整建模过程成品论文matlab/python代码等&#xff08;后续会更新「首先来看看目前已有的资料…