CF1630F-最小割、Dilworth定理

news/2024/11/16 7:19:07/文章来源:https://www.cnblogs.com/yoshinow2001/p/18383199

link:https://codeforces.com/contest/1630/problem/F

给你一个由 \(n\) 个顶点组成的无向图,编号从 \(1\)\(n\) ,其中顶点 \(i\) 的值为 \(a_i\) ,所有值 \(a_i\) 都是不同的。如果 \(a_u\) 整除 \(a_v\) ,则两个顶点 \(u\)\(v\) 之间存在一条边。当删除一个顶点时,也就删除了与之相连的所有边。
问最少删几个点使得得到的是二分图。
\(1\leq n\leq 5\times 10^4\).


首先整除是个偏序关系,它比DAG的性质来得强:如果 \(a|b,b|c\) 则必有 \(a|c\),翻译过来就是如果有边 \(u\to v,v\to w\) 则必有 \(u\to w\),这样就出现了一个三元环。
换言之如果把无向边改成有向边(例如大的连小的),如果要得到二分图,那么不能有长度 \(\geq 2\) 的链,即每条链最长是 \(1\),也就是说每个点要么只有入度,要么只有出度,此时也一定是二分图。

那么就能把点分成两类,拆点:\(u\) 表示 \(u\) 只有出度,\(u'\) 表示只有入度,\((u,u')\) 连一条无向边表示两个事件不能同时发生。如果原图有 \(u\to v\) 的边,则 \(u,v\) 明显也不能同时有出度(这意味着 \(v\) 有入度),因此有 \((u,v)\) 的边,类似地会有 \((u',v'),(u',v)\) 这些边

这样得到了一张新的二分图,图上任意一条边表示两端的事件不能同时发生,如果要保留最多的点,相当于求最大独立集,即求最大的点集 \(V'\subset V\), 使得 \(V'\) 内任意两个点之间无边。

注意到 这张二分图是可以变成偏序集的:

\(ans=n-\) 留下的最多点

留下的最多点=这张图的最大独立集=补图的最长链,补图的边数太多了,而根据Dilworth定理,偏序集上的最长链=补图的最小边覆盖,因此图的最大独立集=最小边覆盖,对这张DAG求个最小路径覆盖=拆点后点数-最小割。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef pair<int,int> pii;template<class T>
struct Dinic{//ind from 0 to n-1struct Edge{int to;T cap;Edge(int to,T cap):to(to),cap(cap){}};int n;vector<Edge> E;vector<vector<int>> G;vector<int> cur,h;Dinic(int n=0){init(n);}void init(int n){this->n=n;E.clear();cur.resize(n);h.resize(n);G.assign(n,{});}void addEdge(int u,int v,T c){G[u].push_back(E.size());E.emplace_back(v,c);G[v].push_back(E.size());E.emplace_back(u,0);}bool bfs(int s,int t){h.assign(n,-1);queue<int> que;h[s]=0;que.push(s);while(!que.empty()){const int u=que.front();que.pop();for(auto i:G[u]){auto [v,c]=E[i];if(c>0&&h[v]==-1){h[v]=h[u]+1;if(v==t)return true;que.push(v);}}}return false;}T dfs(int u,int t,T f){if(u==t)return f;auto r=f;for(int &i=cur[u];i<(int)G[u].size();i++){const int j=G[u][i];auto [v,c]=E[j];if(c>0&&h[v]==h[u]+1){auto a=dfs(v,t,std::min(r,c));E[j].cap-=a;E[j^1].cap+=a;r-=a;if(r==0)return f;}}return f-r;}T work(int s,int t){T ans=0;while(bfs(s,t)){cur.assign(n,0);ans+=dfs(s,t,std::numeric_limits<T>::max());}return ans;}
};
int main(){fastio;constexpr int N=5e4;constexpr int INF=std::numeric_limits<int>::max();int tc;cin>>tc;vector<vector<int>> divisor(N+5);rep(i,1,N)for(int j=i+i;j<=N;j+=i)divisor[j].push_back(i);while(tc--){int n;cin>>n;vector<pii> E;auto work=[&](int n)->int{int st=2*n,ed=2*n+1;Dinic<int> flow(ed+1);for(auto [u,v]:E)flow.addEdge(u,v+n,1);rep(i,0,n-1){flow.addEdge(st,i,1);flow.addEdge(i+n,ed,1);}return n-flow.work(st,ed);};set<int> S;map<int,int> idx;rep(i,0,n-1){int x;cin>>x;S.insert(x);idx[x]=i;E.push_back({idx[x]+n,idx[x]});}for(auto u:S){for(auto v:divisor[u])if(S.contains(v)){E.push_back({idx[u],idx[v]});E.push_back({idx[u]+n,idx[v]+n});E.push_back({idx[u]+n,idx[v]});}}cout<<n-work(n<<1)<<endl;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DocKylin: A Large Multimodal Model for Visual Document Understanding with Efficient Visual Slimming

DocKylin: A Large Multimodal Model for Visual Document Understanding with Efficient Visual Slimming arxiv:http://arxiv.org/abs/2406.19101 视觉处理器+LLM:视觉处理器:Swin Transformer 创新点:通过:1、去除图片冗余像素;2、去除冗余token。来减小模型中的视觉处…

Lab 2: Key/Value Server

6.5840 Lab 2: Key/Value Server 1.Introduction 本次Lab将构建一个单机的键值服务器,该服务器保证即使存在网络故障,每个操作也都只执行一次,并且这些操作线性化执行。后续Lab中,将复制这样的服务器来处理服务器崩溃的情况。 键值服务器支持三种RPC(远程过程调用)操作:Put…

esp-idf vscode debug command espIdf.getXtensaGdb not found

esp32 idf vscode debug错误 vscode中配置文件采用的是正点原子的,调用gdb的时候,提示报错,找不到相应的命令 launch.json文件中gdb的配置如下 {"version": "0.2.0","configurations": [ { "name": "GDB", "type&qu…

Debian12、Ubuntu22安装英特尔wifi驱动

1、打开英特尔无线适配器的 Linux* 支持查看wifi所需的内核版本 以AX200为例,需要Linux内核版本为5.1,Debian12默认内核版本为6.1,Ubuntu24默认内核版本为6..8,因此不需要更新内核。2、打开适用于 Linux* 的英特尔 无线 Wi-Fi 驱动程序下载内核(非必要步骤)和驱动。3、安…

牛客周赛 Round 57

B 可以直接统计每条边两个点的情况即可,不用DFS。 F 写法和这个差不多。可以用map、set、统计这些方法,计算动态的一个数组的最大数。 可以直接用map统计就行,map已经自动给你排好序了(从小到大)。1 #include <bits/stdc++.h>2 using namespace std;3 #define LL lo…

RMQ

RMQ - OI Wiki (oi-wiki.org) 这么说构建和查询,时间复杂度最小的是线段树。最好写的是ST表,emmm,其实线段树也很好写,就是代码量相对多一点。

labelme标注后的数据根据面积过滤,把小面积的多边形改成另一种标签

修改前代码:点击查看代码 import cv2 import numpy as np import json def remove_specific_labels(json_file):# 读取JSON文件with open(json_file, r) as f:data = json.load(f)data_small=dataif"shapes" in data:new_shapes=[]new_shapes_small=[]# 提取闭合区域…

压缩流使用

压缩流场景:需要将一些数据,以及这些数据关联的附件压缩下载,数据导出为一个Excel,附件导出到一个文件夹中 这里使用easyexcel 导出excel 从华为云 obs 下载附件 并交给浏览器public void downloadAllEliminate(HttpServletResponse response) throws IOException {// 响应…

快来领取迅雷加速器7天会员,让你的《黑神话悟空》更新速度嗖嗖嗖!⚡️

嘿,各位《黑神话悟空》的小伙伴们!😆 最近大家肯定都在Steam上体验这款国产3A大作吧?游戏的画质、玩法是不是让你眼前一亮?😍 但是!😫 大家有没有发现,游戏加载和更新时总是龟速,让人望穿秋水?原来是Steam的下载速度太慢啦!🐌 别急别急,今天就给大家安利一个…

Nginx 记录POST记录并设置日志只允许追加

之前想融入到默认配置中。但是还是有一些会出现疑问。只能以文章的形式来配置 之前想过异步的存储日志的方式。但是udp 的方式也是挺消耗性能的无果 一、Nginx 的默认日志文件如下:#设定日志格式,main是默认的格式 log_format main $remote_addr - $remote_user [$time_loca…

pygame手搓贪吃蛇

代码:#coding=utf-8import os,sys,re,time import pygame import random from win32api import GetSystemMetrics import copypygame.init() pygame.display.set_caption("贪吃蛇")percent = 0.6 screen_width = GetSystemMetrics(0) screen_height = GetSystemMetr…

AI创新,DataOps聚能 | 白鲸开源DTCC共话DataOps新篇章

近日,由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会(DTCC 2024)隆重召开。大会以“自研创新 数智未来”为主题,吸引了数百位行业专家和广大数据领域从业者共聚这场年度数据库技术交流盛宴,共同探讨新时代下数据库的技术动态和应用实践。作为…