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

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

然後把這個圖所有的偶環找出來,答案就是這些偶環的長度除以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. Unsupported major.minor version 49.0的错误解决

    Unsupported major.minor version 49.0的错误解决 Posted on 2011-01-14 16:49 chinaifne 阅读(15840) 评论(0)  编辑 收 ...

  2. HTML5新特性:范围样式

    原文出处:http://blog.csdn.net/hfahe/article/details/7381141        Chromium 最近实现了一个HTML5的新特性:范围样式,又叫做< ...

  3. hadoop 学习(二)ubuntu hadoop 2.7.0 伪分部安装

    本篇是基于上一篇,ubuntu 安装hadoop单机版基础上的 1.配置core-site.xml /usr/local/hadoop/etc/hadoop/core-site.xml 包含了hado ...

  4. 2018.09.26 bzoj1015: [JSOI2008]星球大战starwar(并查集)

    传送门 并查集经典题目. 传统题都是把删边变成倒着加边,这道题是需要倒着加点. 处理方法是将每个点与其他点的边用一个vector存起来,加点时用并查集统计答案就行了. 代码: #include< ...

  5. jsp调用java servlet

    1.依赖jar servlet-api.jar 2.工程结构 3.java servlet实现类 package testServlet; import java.io.IOException; im ...

  6. UVa 11167 Monkeys in the Emei Mountain (最大流)

    题意:雪雪是一只猴子.它在每天的 2:00 —— 9:00之间非常渴,所以在这个期间它必须喝掉2个单位的水.它可以多次喝水,只要它喝水的总量是2.它从不多喝,在一小时内他只能喝一个单位的水.所以它喝水 ...

  7. SqlCommand和SqlDataAdapter的区别

    SqlDataAdapter对象 一.特点介绍1.表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接.2.在SqlDataAdapter和DataSet之 ...

  8. Apache Struts 2 Documentation Big Picture

    http://struts.apache.org/docs/big-picture.html 1. HttpServletRequest 穿越各个过滤器到达FilterDispatcher(这个已经不 ...

  9. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memo ...

  10. volatile 类型修饰符

    volatile 类型修饰符 1.解释 就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果不加入vol ...