Playing on Graph

Time Limit: 20 Sec  Memory Limit: 512 MB

Description

  

Input

  

Output

  

Sample Input

  5 4
  1 2
  2 3
  3 4
  3 5

Sample Output

  3

HINT

  n <= 1000, m <= 10^5

Solution

  我们先考虑无解的情况。显然就是图中有奇环的时候无解,因为你将奇环上两点缩起来,最后必定会变成一个三元环,而三元环是不能合并的。所以就可以Dfs黑白染色一下,若是搜到两个同色的话即是有奇环

  我们再考虑如何构造一种方案,显然,我们先找出一个点root,然后将所有 dist 相同的并起来,这样是一组可行解。可以发现,所有的方案都可以由这种方式构造出来。

  那么这时候,确定一点  为 root 的时候,贡献显然等于最大的 dist。那么我们将所有点都确定为root一遍,然后Bfs求一下dist,取出最大dist,就可以得到一个联通块的答案了。

  显然可以有多个连通块Ans = Σ每个连通块的答案

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
typedef long long s64; const int ONE = ;
const int Base = ; int n, m;
int x, y;
int next[ONE], first[ONE], go[ONE], tot;
int vis[ONE], col[ONE];
int pd;
int vis_a[ONE], record[ONE], num, dist[ONE];
int Ans;
queue <int> q; int get()
{
int res;char c;
while( (c=getchar())< || c> );
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res;
} void Add(int u, int v)
{
next[++tot] = first[u], first[u] = tot, go[tot] = v;
next[++tot] = first[v], first[v] = tot, go[tot] = u;
} void Dfs(int u, int color)
{
vis[u] = ;
col[u] = color;
record[++num] = u;
for(int e = first[u]; e; e = next[e])
{
int v = go[e];
if(!vis[v]) Dfs(v, color ^ );
else pd |= col[v] == col[u];
}
} int Bfs(int S)
{
for(int i = ; i <= n; i++) dist[i] = vis_a[i] = ;
dist[S] = , vis_a[S] = , q.push(S);
while(!q.empty())
{
int u = q.front(); q.pop();
for(int e = first[u]; e; e = next[e])
{
int v = go[e];
if(vis_a[v]) continue;
vis_a[v] = ;
dist[v] = dist[u] + ;
q.push(v);
}
} int res = ;
for(int i = ; i <= n; i++)
res = max(res, dist[i]);
return res;
} int main()
{
n = get(); m = get();
for(int i = ; i <= m; i++)
{
x = get(), y = get();
Add(x, y);
} for(int i = ; i <= n; i++)
if(!vis[i])
{
num = ;
Dfs(i, );
if(pd == ) {printf("-1"); return ;} int res = ;
for(int j = ; j <= num; j++)
res = max(res, Bfs(record[j]));
Ans += res;
} printf("%d", Ans);
}

un[ʌn]


  • n. (Un)人名;(柬)温
  • pron. 家伙,东西

【Codeforces542E】Playing on Graph [Bfs][Dfs]的更多相关文章

  1. 【LeetCode】785. Is Graph Bipartite? 解题报告(Python)

    [LeetCode]785. Is Graph Bipartite? 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu. ...

  2. 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法

    字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...

  3. 【CF718E】Matvey's Birthday BFS+动态规划

    [CF718E]Matvey's Birthday 题意:给你一个长度为n的,由前8个小写字母组成的字符串s.构建一张n个点的无向图:点i和点j之间有一条长度为1的边当且仅当:|i-j|=1或$s_i ...

  4. 【BZOJ1054】[HAOI2008]移动玩具 BFS

    [BZOJ1054][HAOI2008]移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个 ...

  5. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  6. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

  7. 【BZOJ2801】[Poi2012]Minimalist Security BFS

    [BZOJ2801][Poi2012]Minimalist Security Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i),并且对于 ...

  8. 【BZOJ2905】背单词 fail树+DFS序+线段树

    [BZOJ2905]背单词 Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行 ...

  9. 【lightoj-1039】A Toy Company(BFS)

    The toy company "Babies Toys" has hired you to help develop educational toys. The current ...

随机推荐

  1. Android 开发错误集锦

    1. eclipse的Device中不显示手机 在eclipse中连接不上手机,出现adb server didn't ACK  fail to start daemon 错误. 出现这种原因是因为a ...

  2. HDU 5794 A Simple Chess dp+Lucas

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 A Simple Chess Time Limit: 2000/1000 MS (Java/O ...

  3. lintcode-179-更新二进制位

    179-更新二进制位 给出两个32位的整数N和M,以及两个二进制位的位置i和j.写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串) 注意事项 In the function ...

  4. OSG数学基础:坐标系变换

    三维实体对象需要经过一系列的坐标变换才能正确.真实地显示在屏幕上.在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的. 坐标系变换通常包括:世界坐标系-物体坐标系变换. ...

  5. 3ds Max学习日记(五)

      把实验室要用的小工具做了出来后,忙里偷闲,把第四章没看完的视频看完了.修改器(modifier)什么的还是挺好玩的.   FFD,车削,倒角,倒角剖面,对称,挤出,晶格,扭曲,融化,弯曲,网格平滑 ...

  6. 【Docker 命令】- inspect命令

    docker inspect : 获取容器/镜像的元数据. 语法 docker inspect [OPTIONS] NAME|ID [NAME|ID...] OPTIONS说明: -f :指定返回值的 ...

  7. 第三部分shell编程3(shell脚本2)

    7. if 判断一些特殊用法 if [ -z $a ] 这个表示当变量a的值为空时会怎么样if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行时会怎么样if ...

  8. 什么情况下需要检测预装Win8/8.1电脑内置激活密钥(即Win8/8.1 OEM key)?

    1.针对预装在品牌机中的Win8操作系统,因使用了某些软件或自己操作不当导致系统激活Key被替换而激活失效时,你需要找到内置在电脑中的OEM key,重新输入OEM key来激活系统. 2.针对预装W ...

  9. matlab中nargin函数的用法

    nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能. 通常可以用他来设定一些默认值,如下面的函数. 例子,函数test1的功能是输出a和b的和.如果只输入一个变量,则认为 ...

  10. CF995A Tesla

    题目描述 Allen dreams of one day owning a enormous fleet of electric cars, the car of the future! He kno ...