题意简述

给定一个图 求至少添加多少条边使得它存在奇环 并求出添加的方案数

(注意不考虑自环)

-----------------------------------------------------------------------------

一道二分图染色的讨论题

比赛时只会用二分图染色判断树以及偶环 忘记用这个来判奇环。。。

二分图染色这种联赛知识点的题目现在也不会写了。。。

------------------------------------------------------------------------------

我们可以按需要添加边的条数来讨论这题

首先讨论添加边条数为3——即原原图边数m为0时

$ans=n*(n-1)*(n-2)/6$

再讨论添加边条数为2——即原图中所有边都没有公共端点/所有点度数<=1 时

$ans=m*(n-2)$

再讨论添加边数为0——即原图中存在奇环时

$ans=1$

最后讨论添加边数为1——即原图中只有树以及偶环

$ans=\sum(white[i]-1)*white[i]/2+(black[i]-1)*black[i]/2$

其实思路清晰后实现起来就很容易了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define imax(x,y) (x>y?x:y)
#define imin(x,y) (x<y?x:y)
using namespace std;
const int N=;
int firste[N],nexte[N<<],v[N<<];
int color[N],fa[N],bl[N],wh[N],degree[N];
int n,m,e=,flag=;
long long ans=;
void build_edge(int x,int y)
{
++e;
nexte[e]=firste[x];
firste[x]=e;
v[e]=y;
}
void dfs(int u,int c,int f)
{
color[u]=c;
fa[u]=f;
if(c&)++bl[f];
else ++wh[f];
for(int p=firste[u];p;p=nexte[p])
if(!color[v[p]])dfs(v[p],-c,f);
else if(color[v[p]]==color[u])
{
flag=;
return;
}
}
int main()
{
int x,y;
scanf("%d%d",&n,&m);
if(!m)
{
ans=(long long)n*(n-)*(n-)/;
printf("3 %I64d",ans);
return ;
}
rep(i,m)
{
scanf("%d%d",&x,&y);
build_edge(x,y);
build_edge(y,x);
++degree[x];
++degree[y];
if(degree[x]>||degree[y]>)flag=;
}
if(flag)
{
ans=(long long)m*(n-);
printf("2 %I64d",ans);
return ;
}
int cnt=;
rep(i,n)
if(!color[i])
{
dfs(i,,++cnt);
if(flag)
{
printf("0 1");
return ;
}
}
rep(i,cnt)
ans+=(long long)(wh[i]-)*wh[i]/+(long long)(bl[i]-)*bl[i]/;
printf("1 %I64d",ans);
return ;
}

codeforces 557D Vitaly and Cycle的更多相关文章

  1. CodeForces - 557D Vitaly and Cycle(二分图)

    Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  2. codeforces 557D. Vitaly and Cycle 二分图染色

    题目链接 n个点, m条边, 问最少加几条边可以出现一个奇环, 在这种情况下, 有多少种加边的方式. 具体看代码解释 #include<bits/stdc++.h> using names ...

  3. Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 图论

    D. Vitaly and Cycle Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/p ...

  4. codeforces 557 D. Vitaly and Cycle 组合数学 + 判断二分图

    D. Vitaly and Cycle       time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 奇环

    题目链接: 点这里 题目 D. Vitaly and Cycle time limit per test1 second memory limit per test256 megabytes inpu ...

  6. Codeforces Round #311 (Div. 2) D - Vitaly and Cycle

    D. Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. 【34.57%】【codeforces 557D】Vitaly and Cycle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. Codeforces Round #311 (Div. 2) D - Vitaly and Cycle(二分图染色应用)

    http://www.cnblogs.com/wenruo/p/4959509.html 给一个图(不一定是连通图,无重边和自环),求练成一个长度为奇数的环最小需要加几条边,和加最少边的方案数. 很容 ...

  9. codeforces 518A. Vitaly and Strings

    A. Vitaly and Strings time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. Java IO(2)

    关于流的概念 Java 由流来完成具体的IO操作,虽然面对的是不同的外设(网络.鼠标.键盘)IO流使用与全部的外设,在底层Java已经将具体与物理设备交互的细节都处理好了. 流的分类: 从功能上 输入 ...

  2. Python 学习笔记16 类 - 导入

    我们在编码的过程中,可能会给对象添加越来越多的功能,即使我们使用了继承,也不可避免的使文件越来越臃肿. 为了避免这种情况, Python允许将对象存储在模块中,并且可以在其他模块中进行导入. 其实这和 ...

  3. 【洛谷p2089】 烤鸡

    烤鸡[题目链接] 感觉我超废 关于算法:有很多很多算法吧,但自我感觉最重要的是递归的算法: SOLUTION: 首先忍不住要吐槽这个神仙数据: 嗯???定睛一看,它这数据范围莫不是白瞎了,因为每种配料 ...

  4. Codeforces 1082D (贪心)

    题面 传送门 分析 贪心 将度限制大于1的点连成一条链,然后将度限制等于1的点挂上去 形状如下图,其中(1,2,3)为度数限制>1的点 显然直径长度=(度数限制>1的节点个数)-1+min ...

  5. BZOJ 3262(Treap+树状数组)

    题面 传送门 分析 分三维考虑 对第一维,直接排序 对第二维和第三维,我们这样考虑 朴素的方法是建k棵Treap,第i棵Treap里存第二维值为k的第三维数值 每次查询一组(a,b,c),只要在1~b ...

  6. django的配置

    1.django的默认配置 import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) # 获取 ...

  7. 4、numpy——创建数组

    1.普通创建——np.array() 创建数组最简单的方法就是使用array函数.它接收一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的Numpy数组. import numpy as ...

  8. SqlServer 查看表注释

    SELECT DISTINCT d.name, f.value FROM syscolumns a LEFT JOIN systypes b ON a.xusertype= b.xusertype I ...

  9. Linux ssh的的用法

    Linux ssh的的用法 ssh执行远程命令 1. 执行命令 1.执行单条命令 ubuntu@node1:~$ ssh ubuntu@172.16.10.102 hostname ubuntu@17 ...

  10. redis缓存切面实现(支持缓存key的spel表达式)

    1.定义注解 package com.g2.order.server.annotation; import java.lang.annotation.ElementType; import java. ...