题意:给定一张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 ;
}

【CF387D】George and Interesting Graph(二分图最大匹配)的更多相关文章

  1. cf D George and Interesting Graph

    题意:给你一个有趣图的定义:在这个图中有一个根,根与每个点都有边和回边,除了根之外,其他的点的出度和入度都为2,然后给你一个图让你经过几步操作可以使此图变为有趣图,操作为:删边或者加边. 思路:枚举根 ...

  2. POJ 2446 Chessboard(二分图最大匹配)

    题意: M*N的棋盘,规定其中有K个格子不能放任何东西.(即不能被覆盖) 每一张牌的形状都是1*2,问这个棋盘能否被牌完全覆盖(K个格子除外) 思路: M.N很小,把每一个可以覆盖的格子都离散成一个个 ...

  3. POJ 2536 Gopher II(二分图最大匹配)

    题意: N只地鼠M个洞,每只地鼠.每个洞都有一个坐标. 每只地鼠速度一样,对于每只地鼠而言,如果它跑到某一个洞的所花的时间小于等于S,它才不会被老鹰吃掉. 规定每个洞最多只能藏一只地鼠. 问最少有多少 ...

  4. POJ 2584 T-Shirt Gumbo(二分图最大匹配)

    题意: 有五种衣服尺码:S,M,L,X,T N个人,每个人都有一个可以穿的衣服尺码的范围,例:SX,意思是可以穿S,M,L,X的衣服. 给出五种尺码的衣服各有多少件. 如果可以满足所有人的要求,输出 ...

  5. POJ 1274 The Perfect Stall(二分图最大匹配)

    题意: N头牛M个牛棚,每只牛都有它自己指定的若干个它愿意呆的牛棚. 每个牛棚最多呆一头牛. 问最多可以满足多少头牛的愿望. 思路: 裸二分图最大匹配. 代码: int n,m; vector< ...

  6. hdu 1083 Courses(二分图最大匹配)

    题意: P门课,N个学生.     (1<=P<=100    1<=N<=300) 每门课有若干个学生可以成为这门课的代表(即候选人). 又规定每个学生最多只能成为一门课的代 ...

  7. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  8. POJ2239 Selecting Courses(二分图最大匹配)

    题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...

  9. poj 2239 二分图最大匹配,基础题

    1.poj 2239   Selecting Courses   二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...

随机推荐

  1. SSH框架使用poi插件实现Excel的导入导出功能

    采用POI生成excel结构 直接贴出代码  excel表格导出功能 action代码: struts.xml配置: 前台jsp代码:

  2. mysql 从陌生到熟练之----数据库备份恢复的实现方法

    mysql 从陌生到熟练之----数据库备份恢复的实现方法 MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:roo ...

  3. 2d游戏中求出一个向量的两个垂直向量

    function cc.exports.VerticalVector(vec)--求出两个垂直向量 local result = {} result[1] = cc.p(vec.y/vec.x,-1) ...

  4. Neural Style论文笔记+源码解析

    引言 前面在Ubuntu16.04+GTX1080配置TensorFlow并实现图像风格转换中介绍了TensorFlow的配置过程,以及运用TensorFlow实现图像风格转换,主要是使用了文章A N ...

  5. 在Keras中导入测试数据的方法

    https://blog.csdn.net/ethantequila/article/details/80322425?utm_source=blogxgwz2

  6. (71)Received empty response from Zabbix Agent问题解决

    刚接触zabbix新手少部分会出现如下错误: Received empty response from Zabbix Agent at [192.168.1.2]. Assuming that age ...

  7. Flask-数据与路由

    数据 图书数据库的地址 # 基地址 http://t.yushu.im # 关键字搜索 http://t.yushu.im/v2/book/search?q={}&start={}&c ...

  8. Linux基础学习-crond系统计划任务

    系统计划任务 大部分系统管理工作都是通过定期自动执行某个脚本来完成的,那么如何定期执行某个脚本,从而实现运维的自动化,这就要借助Linux的cron功能了. 计划任务分为一次性计划任务和周期性计划任务 ...

  9. PHP 日常开发过程中的bug集合(持续更新中。。。)

    PHP 日常开发过程中的bug集合(持续更新中...) 在日常php开发过程中,会遇到一些意想不到的bug,所以想着把这些bug记录下来,以免再犯! 1.字符串 '0.00'.'0.0'.'0'  是 ...

  10. 【mysql】【windows】MySQL 服务无法启动,服务没有报告任何错误,请键入 NET HELPMSG 3534 以获得更多的帮助。

    成功安装以后,启动MySQL,输入: net start mysql 提示: ”MySQL 服务无法启动,服务没有报告任何错误,请键入 NET HELPMSG 3534 以获得更多的帮助.” 查了下, ...