我們發現,如果有奇環顯然無解,因為我們每一次合併一個奇環,一定會產生一個偶環和一個更小的奇環,最終會形成一個三元環而無法合併

所以,這個圖需要是一個二分圖,需要進行二染色

然後把這個圖所有的偶環找出來,答案就是這些偶環的長度除以2,這樣子很難

然而我們發現,偶環上的任意兩個點的最大距離的最短值一定等於偶環長度除以2,所以找出上一問等價于找出最短路的最大值,進行bfs即可

但是有可能有多個聯通塊,所以我們可以尋找所有聯通塊中的最短路徑的最大值即可

代碼:

#include<bits/stdc++.h>
using namespace std;
int v[200010],nxt[200010],h[100010],ec,n,m,col[100010],vis[100010],st[100010],ct,ok,d[1010],p[100010],r;
void add(int x,int y){v[++ec]=y;nxt[ec]=h[x];h[x]=ec;}
void dfs(int x){
	vis[x]=1;st[++ct]=x;
	for(int i=h[x];i;i=nxt[i]){
		if(!vis[v[i]]){
			col[v[i]]=!col[x];
			dfs(v[i]);
		}
		else if(vis[v[i]]&&col[v[i]]==col[x])ok=0;
	}
}
int main(){
	freopen("merge.in","r",stdin);
	freopen("merge.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	for(int i=1;i<=n;i++)if(!vis[i]){
		ok=1;int ans=0;
		dfs(i);
		if(!ok){
			printf("-1");
			return 0;
		}
		queue<int>q;
		for(int j=1;j<=ct;j++){
			memset(d,127,sizeof(d));
			q.push(st[j]);
			d[st[j]]=0;
			while(!q.empty()){
				int x=q.front();q.pop();
				ans=max(ans,d[x]);
				for(int k=h[x];k;k=nxt[k])
					if(d[v[k]]>d[x]+1){
						d[v[k]]=d[x]+1;
						q.push(v[k]);
					}
			}
		}
		r+=ans;
		ct=0;
	}
	printf("%d",r);
}

jzoj5806的更多相关文章

  1. [Solution] JZOJ-5806 简单的操作

    [Solution] JZOJ-5806 简单的操作 题面 Description 从前有个包含n个点,m条边,无自环和重边的无向图. 对于两个没有直接连边的点u;v,你可以将它们合并.具体来说,你可 ...

随机推荐

  1. (转载)我的java问题排查工具单

    原文地址:https://yq.aliyun.com/articles/69520 我的问题排查工具箱 前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在 ...

  2. 递归生成treeview树形节点(没有用递归函数之后会有补充,这里只用系统的内置方法去生成)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using Syst ...

  3. 2018.06.29 NOIP模拟 边的处理(分治+dp)

    边的处理(side.cpp) [问题描述] 有一个 n 个点的无向图,给出 m 条边,每条边的信息形如<x,y,c,r><x,y,c,r><x,y,c,r>. 给出 ...

  4. Django介绍(3)

    https://www.cnblogs.com/yuanchenqi/articles/5786089.html

  5. k8s的port、targetport、nodeport之间的区别

    先看举例: k8s集群中跑着一个tomcat服务,tomcat容器expose的端口为8080 apiVersion: v1 kind: Service metadata: name: tomcat- ...

  6. 机器学习 数据预处理之独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  7. DIV+CSS实战(五)

    一.说明 前面实现了关键词订阅模块,现在实现站点订阅模块,主要实现的是站点添加界面.站点添加界面里面实现一个提示框不在提示的功能(保存到cookie中),还有就是实现一个站点的选择框,包括输入文字自动 ...

  8. MFC自动生成代码详解(一)

    首先声明这篇博客是给MFC刚刚上路的coder准备的,老鸟们就自觉无视我吧! 大家有没有感觉,创建MFC工程时他总会生成一大堆文件一大堆代码.虽然给我们带来了便利,但是调试的时候碰到这些代码总是畏首畏 ...

  9. STL中的algorithm

    STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...

  10. [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现

    // 还存在有问题的代码,问题在于processFile()中// 问题:在ipone 5c 下,某些图片压缩处理后,上传到服务器生成的文件size为0,即是空白 ;define(['mod/tool ...