codeforces 557D Vitaly and Cycle

题意简述

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

(注意不考虑自环)

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

一道二分图染色的讨论题

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

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

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

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

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

ns=n*(n-1)*(n-2)/6

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

ans=m*(n-2)

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

ans=1

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

ans=Σ(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=100010;
int firste[N],nexte[N<<1],v[N<<1];
int color[N],fa[N],bl[N],wh[N],degree[N];
int n,m,e=1,flag=1;
long long ans=0;
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&1)++bl[f];
    else ++wh[f];
    for(int p=firste[u];p;p=nexte[p])
        if(!color[v[p]])dfs(v[p],3-c,f);
    else if(color[v[p]]==color[u])
    {
        flag=1;
        return;
    }
}
int main()
{
    int x,y;
    scanf("%d%d",&n,&m);
    if(!m)
    {
        ans=(long long)n*(n-1)*(n-2)/6;
        printf("3 %I64d",ans);
        return 0;
    }
    rep(i,m)
    {
        scanf("%d%d",&x,&y);
        build_edge(x,y);
        build_edge(y,x);
        ++degree[x];
        ++degree[y];
        if(degree[x]>1||degree[y]>1)flag=0;
    }
    if(flag)
    {
        ans=(long long)m*(n-2);
        printf("2 %I64d",ans);
        return 0;
    }
    int cnt=0;
    rep(i,n)
    if(!color[i])
    {
        dfs(i,1,++cnt);
        if(flag)
        {
            printf("0 1");
            return 0;
        }
    }
    rep(i,cnt)
    ans+=(long long)(wh[i]-1)*wh[i]/2+(long long)(bl[i]-1)*bl[i]/2;
    printf("1 %I64d",ans);
    return 0;
}
时间: 2024-10-11 03:38:03

codeforces 557D Vitaly and Cycle的相关文章

Codeforces Round #311 (Div. 2) D. Vitaly and Cycle(二分图染色,奇环)

给定n个点,m条边. 求最少最要加几条边使图中存在奇环,且输出此时加边的方法种数 根据题意,只可能为 0:已经存在奇环,dfs搜到已经染色的且颜色相同 1:判断每个连通块里的 染色黑白色的个数 2 :某个点的 度 > 1 3:0条边 1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 #include<stack> 6 #include

CodeForces 518A Vitaly and Strings (水题,字符串)

题意:给定两个相同长度的字符串,让你找出一个字符串,字典序在两都之间. 析:这个题当时WA了好多次,后来才发现是这么水,我们只要把 s 串加上,然后和算数一样,该进位进位,然后再和 t 比较就行. 代码如下: #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <cstring> #in

CodeForces 595A Vitaly and Night

水题. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int a[300][300]; int n,m,ans; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=2*m;j++) s

[cf557d]Vitaly and Cycle(黑白染色求奇环)

题目大意:给出一个 n 点 m 边的图,问最少加多少边使其能够存在奇环,加最少边的情况数有多少种. 解题关键:黑白染色求奇环,利用数量分析求解. 奇环:含有奇数个点的环. 二分图不存在奇环.反之亦成立. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using nam

Codeforces Round #311 (Div. 2) A,B,C,D,E

A. Ilya and Diplomas 思路:水题了, 随随便便枚举一下,分情况讨论一下就OK了. code: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #define inf 1000000

随笔—邀请赛前训— Codeforces Round #330 (Div. 2) Vitaly and Night

题意:给你很多对数,要么是0要么是1.不全0则ans++. 思路即题意. #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define ABS(x) ((x)>0?(x):-(x))

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C】 Permutation Cycle

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] p[i] = p[p[i]]一直进行下去 在1..n的排列下肯定会回到原位置的. 即最后会形成若干个环. g[i]显然等于那个环的大小. 即让你形成若干个环. 每个环的大小只能为A或B 则相当于问Ax+By=n是否有解. 可以枚举x然后看看n-A*x能否被B整除. 构造x个长度为A的环,y个长度为B的环就好了 [代码] #include <bits/stdc++.h> using namespace std; const in

CodeForces 510 B. Fox And Two Dots(DFS 啊)

题目链接:http://codeforces.com/problemset/problem/510/B Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on a board of size n?×?m cells, like this: Each cell contains a dot that has some color. We will use diff

CodeForces 300C 最短路

A Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 300C Description Vitaly is a very weird man. He's got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal