【CF387D】George and Interesting Graph(二分图最大匹配)
2024-08-23 00:37:40
题意:给定一张n点m边没有重边的有向图,定义一个有趣图为:存在一个中心点满足以下性质:
1、除了这个中心点之外其他的点都要满足存在两个出度和两个入度。
2、中心 u 需要对任意顶点 v(包括自己)有一条(u,v)的边和(v,u)的边,即他们都要互通。
现在可以删除和添加边,使得给出的原图满足以上情况。询问删除和添加的最小操作次数。
n<=500,m<=1000
思路:枚举中心u,将边分为不相同的三部分:
1.u的自环,记为cir=(0..1)
2.u的出边或入边,记为out与in
3.与u无关的边
存在以下性质:原图删去中心以及1,2类边后每个点的出度与入度都为1
相当于一个点裂成了一个出点与入点,对这些点与边跑二分图最大匹配
考虑答案也有三部分组成:
1.原图中无用的边,即m-in-out-cir-maxmatch
2.需要添加的与中心无关的边,即n-1-maxmatch
3.需要添加的与中心相关的边,即2*(n-1)-in-out+1-cir
三部分加起来即为所求
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 1100
#define M 1100
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int head[N],vet[N],nxt[N],match[N],flag[N],x[N],y[N],n,m,tot; int add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} int dfs(int u)
{
flag[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(!match[v]||!flag[match[v]]&&dfs(match[v]))
{
match[v]=u;
return ;
}
e=nxt[e];
}
return ;
} int calc(int mid)
{
int in=;
int out=;
int cir=;
memset(head,,sizeof(head));
tot=;
for(int i=;i<=m;i++)
{
if(x[i]==mid&&y[i]==mid)
{
cir=;
continue;
}
if(y[i]==mid){in++; continue;}
if(x[i]==mid){out++; continue;}
add(x[i],y[i]);
} memset(match,,sizeof(match));
int maxmatch=;
for(int i=;i<=n;i++)
{
memset(flag,,sizeof(flag));
if(dfs(i)) maxmatch++;
}
int del=m-in-out-cir-maxmatch; //无用,删
int plus=n--maxmatch; //无关中心,加
int t=*(n-)-in-out+-cir; //中心相关
return del+plus+t;
} int main()
{
//freopen("cf387d.in","r",stdin);
//freopen("cf387d.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) scanf("%d%d",&x[i],&y[i]);
int ans=oo;
for(int i=;i<=n;i++) ans=min(ans,calc(i));
printf("%d\n",ans);
return ;
}
最新文章
- 搭建一个简单的mybatis框架
- zeroclipboard浏览器复制插件使用记录
- div css 自适应
- 避开WebForm天坑,拥抱ASP.Net MVC吧
- JS+JavaBean判断管理员增删改的操作权限
- Navicat For Mysql快捷键
- Java基础之在窗口中绘图——移动曲线的控制点(CurveApplet 3 moving the control points)
- 使用它tshark分析pcap的例子以及scapy下载地址
- 洛谷P2732 商店购物 Shopping Offers
- python 小试牛刀之信息管理
- android 二维码生成+扫描
- 使用讯飞SDK,实现文字在线合成语音
- Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库
- CLOUDSTACK我也来啦
- 基础总结篇之中的一个:Activity生命周期
- BZOJ 2821: 作诗(Poetize)( 分块 )
- 设计模式16:迭代模式(Iterator)
- Python tkinter调整元件在窗口中的位置与几何布局管理
- python基础5 字典
- Python运维开发基础09-函数基础【转】
热门文章
- RenderBody,RenderPage和RenderSection
- HashMap与ArrayMap(和SparseArray)的比较与选择
- C++:100阶乘数组输出
- destoon修改笔记
- DeepFaceLab: SSE,AVX, OpenCL 等版本说明!
- 【js】【转发】jreturn;、return true、return false;区别
- zookeeper伪集群(一)
- Oracle redo与undo 第一弹
- POJ:2955-Brackets(经典:括号匹配)
- selenuim2模拟鼠标键盘操作