传送门

分析

(直接帖题解)
先考虑连通图的情况。
首先如果原图不是二分图,显然无解。因为对于一个长度大于 3 的奇环,如果合并环上任意两个不相邻的点,一定会生成一个更小的奇环,最终会剩下一个三元环,无法继续合并。
对于任意联通的二分图,我们可以选定一个点 s,然后将所有与 s 距离相同的点合并。由于原图是二分图,所有与 s 距离相同的点必然在同一侧,也就一定不相邻,这样就可以构造出一条链。因此只需要找出两个点,使得它们间的最短路径最长。显然这样构造是最优的。
考虑有多个连通分量的情况,我们对于每一个连通分量都构造了一条链,而对于任意两条链,我们显然可以通过一次合并操作将它们并成一条,长度为它们的长度之和。因此,答案就是所有连通块的直径之和。
使用 BFS 求出最短路,时间复杂度为O(nm) 。

#include<bits/stdc++.h>
#define N 1005
#define M 100005
using namespace std;
int tot,head[N],Next[M<<1],vet[M<<1];
void add(int x,int y){tot++;vet[tot]=y;Next[tot]=head[x];head[x]=tot;
}
int n, m,col[N],seq_n,seq[N];
bool vis[N];
bool dfs(int u, int now){vis[u]=true;col[u]=now;seq[++seq_n]=u;bool ok=true;for(int i=head[u];i&&ok;i=Next[i]){int v=vet[i];if(!vis[v])ok&=dfs(v,!now);else ok&= now!=col[v];}return ok;
}
int q_n,q[N];
int lev[N];
int bfs(int sv){for (int i=1;i<=seq_n;i++)lev[seq[i]]=-1;lev[sv]=0,q[q_n=1]=sv;for (int j=1;j<=q_n;j++){int u=q[j];for (int i=head[u];i;i=Next[i]){int v=vet[i];if (!~lev[v])lev[q[++q_n]=v]=lev[u]+1;}}int l=0;for (int i=1;i<=seq_n;i++)l=max(l,lev[seq[i]]);return l;
}
int solve(){int res=0;for (int u=1;u<=n;u++)if(!vis[u]){seq_n=0;if(!dfs(u, 0))return -1;int l=0;for (int i=1;i<=seq_n;i++)l=max(l,bfs(seq[i]));res+=l;}return res;
}
int main(){scanf("%d%d",&n,&m);for (int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);}printf("%d",solve());return 0;
}

Luo's oj P1918 简单的操作相关推荐

  1. Luo's oj P1916 简单的序列(bracket)

    传送门 分析 我们将左括号看作 1,右括号看作 -1,则一个合法的括号序列需要满足: *所有括号的总和为 0 *每个前缀和均不小于0 我们先统计出串 s 的总和 a 以及最小的前缀和 b,然后枚举串 ...

  2. 通过JavaScript简单的操作DOM(一)

    通过JavaScript简单的操作DOM (一)简单的前提概念 1.DOM简介 DOM,文档对象模型.描述了HTML和XML文档结构,然后提供API,来帮助开发人员添加.删除.修改页面的某一部分. ( ...

  3. Pandas简明教程:五、Pandas简单统计操作及通用方式

    文章目录 1.DataFrame的方法使用举例 2.DataFrame的方法调用通用方式 3.DataFrame直接调用其它方法 本系列教程教程完整目录: 前面已经提到,Pandas的DataFram ...

  4. python 创建文件_Python入学首次项目,新手必看,简单易操作

    继昨天文章python软件pycharm安装教程之后,今天则给新手小白们分享一哈,怎么制作并创建文件.print "hello world": 如后期需要资料文件的则可以私信留言, ...

  5. common lisp 学习第二天 简单数据库操作

    //简单数据操作 单一记录 > (defun make-cd (title artist rating ripped) (list :title title :artist artist :ra ...

  6. nodejs操作sqlserver数据_nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例...

    本文实例讲述了nodejs基于mssql模块连接sqlserver数据库的简单封装操作.分享给大家供大家参考,具体如下: 注意:开启sqlserver服务器允许远程连接的步骤,自行百度,很多经验,no ...

  7. php加数据库开发案例,PHP简单数据库操作类实例【支持增删改查及链式操作】

    本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类 ...

  8. Visio画图导出PDF矢量图并裁剪,只需有visio就行,简单好操作

    Visio画图导出PDF矢量图并裁剪,只需有visio就行,简单好操作 Visio是专业画图软件 Visio软件里面导出PDF文件, 然后进去PDF裁剪网站 上传需要裁剪的PDF, 点"up ...

  9. vivox27微信无法连接服务器,vivo X27微信拍照模糊怎么办?简单一个操作轻松解决...

    有小伙伴反映新买的vivo X27手机微信拍照模糊,明明手机的镜头也不错,为什么拍出来的照片会这么烂呢?下面,丢锋网就vivo X27为例教大家简单一个操作轻松解决. vivo X27手机微信拍照模糊 ...

最新文章

  1. (实际开发大数据分析系统)网络爬虫获取数据与销售数据分析系统
  2. leetcode 25. Reverse Nodes in k-Group | 25. K 个一组翻转链表(Java)
  3. oracle数据库倒顺,mysql常用命令
  4. 虚拟ip工具_针对游戏防封换IP有用吗?
  5. dev_open linux,linux 伪终端设备 /dev/ptmx
  6. 电商产品页多种出彩表现设计手法!
  7. 快速排序菜鸟python_python菜鸟教程学习13:文件操作
  8. Redis学习笔记(三)
  9. 2 华为云闪付_教你区分信用卡刷卡、挥卡、插卡、云闪付等支付方式!
  10. sql server 监视_如何在SQL Server中监视对象空间增长
  11. android遥控器:控制电脑上的暴风影音播放(C#作为服务端)
  12. hammerJs-v2.0.4详解
  13. android接入微信登录授权提示{errcode:40125,errmsg:invalid appsecret, view more at 。。。解决办法
  14. socket: (10106) 无法加载或初始化请求的服务提供程序。
  15. Retrofit2 详解和使用(一)
  16. 行人重识别github开源库——HJL-re-id
  17. 【精美后台管理系统模版->UI界面欣赏】
  18. android jmf,基于JMF与Android的无线视频监控系统的设计与实现
  19. python之flappy bird(飞扬的小鸟)小游戏分享,内附源码哦~
  20. 关于Elesvier的LaTeX期刊论文模板中图片、表格的标题字体更改问题

热门文章

  1. 如何在linux中后台运行R
  2. matlab deconv出现无穷大,【 MATLAB 】deconv 函数介绍
  3. 临时禁用clang-format
  4. Android App加固原理分析
  5. 启动docker服务
  6. WEBshell与文件上传漏洞
  7. uniapp - 全平台兼容的 “多图上传“ 功能,搭配 uview 组件库中的 upload 上传组件(附带详细的示例源码及注释,可直接复制使用或简单修改)
  8. matlab的二维曲线论文,基于几何画板与MATLAB绘制二维曲线
  9. 逐浪软件智图->全网发布∞面向企业级的智能图库
  10. 孔乙己的长衫!ChatGPT 最可能取代的 10 种工作!