传送门

题目大意

给定$n$个点$m$条边的简单图(无重边无自环),将有序点对$\{a,b\}$作为新的点,新产生的$n^2$个点中对于两个点,$\{a,b\},\{x,y\}$,当且仅当原图中存在边$(a,x)$和$(b,y)$,则在新图中产生边$(\{a,b\},\{x,y\})$。求新图中连通块数。

题解

想一想新图的两个点联通有什么条件,就能渐渐推理出这个很显然的性质。

若新图中$\{a,b\}$与$\{x,y\}$连通,则在原图中:

$a,x$连通,$b,y$连通。

$a,x$之间和$b,x$存在一条长度相同的路径(可以不是简单路径)

若$a,x$连通、$b,y$连通,当且仅当$a,x$间只存在长为奇数的路径,$b,y$之间只存在长为偶数的路径(或相反),在新图中$\{a,b\}$,$\{b,y\}$不连通。

若两个原图连通块$A,B$,对于有的点$\space a,\space x\in A$,$b,y\in B\space$,当且仅当$A,B$均不存在奇环时,即$A,B$均为二分图时才可能出现$\{a.b\}$与$\{x,y\}$不连通,且会在新的图中恰好分为$2$个连通块。

我们需要特判单点(度数为$0$)的情况:对所有至少包含一个原图单点的新图的点,它一定自成一个连通块。

计有$K$个度数为$0$的单点,有$P$个二分图连通块,$Q$个非二分图连通块,由于新图中每一个连通块一定有原图中的一个或两个连通块产生,我们可以直接计算答案。$$Ans=\space K(2n-1)-K(K-1)\space + \space P^2\space +\space Q^2\space +\space 2\times P\cdot Q$$

注意新图中的点对是有序,即$(a,b)$与$(b,a)$不同,第一部分是包含一个读数为$0$的单点的点对数,接下来的两个是枚举前面的点和后面的点在哪一个原图的性质相同的连通块里,即(都有奇环或都没有),其中两个二分图会产生两组,所以要乘$2$。最后那个部分是枚举前后的点在不同的连通块中,因为前后有别所以要乘$2$。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 200020
using namespace std;
LL read(){
LL nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
LL ans,sum0,sum1,sig;
LL n,m,fs[M],nt[M<<1],to[M<<1],col[M],f[M],sz[M],tmp;
LL fd(LL x){return x==f[x]?x:f[x]=fd(f[x]);}
void link(LL x,LL y){nt[tmp]=fs[x],fs[x]=tmp,to[tmp++]=y;}
void merge(LL x,LL y){x=fd(x),y=fd(y);if(x!=y) f[x]=y,sz[y]+=sz[x];}
bool check(LL x,LL now){
if(col[x]) return col[x]==now; col[x]=now;
for(LL i=fs[x];i!=-1;i=nt[i])
if(!check(to[i],3-now)) return false;
return true;
}
int main(){
n=read(),m=read(),memset(fs,-1,sizeof(fs));
for(LL i=1;i<=n;i++) f[i]=i,sz[i]=1;
for(LL i=1;i<=m;i++){
LL x=read(),y=read();
link(x,y),link(y,x),merge(x,y);
}
for(LL i=1;i<=n;i++) if(fd(i)==i&&sz[i]==1) sig++;
for(LL i=1;i<=n;i++){
if(fd(i)!=i||sz[i]==1) continue;
if(check(i,1)) sum0++;
else sum1++;
}
ans+=sig*((n<<1)-1)-sig*(sig-1);
ans+=((sum0*sum0)<<1);
ans+=sum1*(sum0<<1)+sum1*sum1;
printf("%lld\n",ans);
return 0;
}

  

Agc011_C Squared Graph的更多相关文章

  1. Atcoder Grand 011 C - Squared Graph

    题意: 给出一个n个点的图,现在构造一个有n^2个点的新图,新图每个点表示为(a,b)(a,b<=n),两个点$(a,b),(c,d)$之间有边当且仅当原图中ac之间有边,bd之间有边. 问新图 ...

  2. 【AtCoder】AGC011 C - Squared Graph

    题解 大意是给出一张图,然后建一张新图,新图的点标号是(a,b) 如果a和c有一条边,b和d有一条边,那么(a,b)和(c,d)之间有一条边 我们把这道题当成这道题来做,给出两张图,如果第一张图有边( ...

  3. AGC011-C Squared Graph

    题意 给定一个\(n\)个点\(m\)条边的图,构建一个\(n^2\)个点的图,新图的每个点都可以看成一个二元组,新图上的点\((a,b)和(a′,b′)\)之间有边,当且仅当原图中\((a,a′), ...

  4. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  5. NOIp2018模拟赛四十一

    现在是下午15:36,我已经改完题了...刷新纪录 A题叫B,B题叫A是什么操作??? 我离200只差一个SBFA.jpg 成绩:0+100+10=110 被虐啦...今天九个阿克的Orz.A题是个神 ...

  6. A*G/C011

    A*G/C011 A Airport Bus 不会zbl/kk B Colorful Creatures 枚举每个开始的点直接倍增 我好像sb了,可行的是一段前缀所以可以直接2分 C Squared ...

  7. 【AtCoder】AGC011

    AGC011 A - Airport Bus 大意:有N个人,每个人只能在\([T_i,T_i +K]\)这段区间乘车,每辆车安排C人,问最少安排几辆车 直接扫,遇到一个没有车的在\(T_i +K\) ...

  8. What’s up with the Graph Laplacian

    What's up with the Graph Laplacian? 来源 作者:Jeremy Kun blog: Math ∩ Programming 在数学上图和与图关联的某些矩阵的代数性质有很 ...

  9. [开发笔记] Graph Databases on developing

    TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...

随机推荐

  1. 第4章 URL管理器和实现方法

    URL管理器:管理待抓取URL集合和已抓取URL集合 -- 防止重复抓取.防止循环抓取 URL需要支持哪些功能: 添加新URL到待爬取集合中.判断待添加URL是否在容器中,判断是否还有待爬取URL,获 ...

  2. Mysql的学习研究

    2017年5月16日11:26:17 从今天开始过一遍数据库的基础教程,加油!!!!! 看了之后对一些基础知识有了理解,加油... 笔记: 2017年5月16日11:35:46mysql的基础教程1. ...

  3. 大数进制转换 poj1220

    普通的做法,大数除小数. 复杂度o( log(n)*log(n) ),其实就是位数的平方. NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Lim ...

  4. BestCoder Round #63 (div.2)

    感觉有些无聊的比赛. A 暴力枚举下就行 B 简单的dp,但是wa了一发后就去先把C做了,然后发现如果输入的100个数,是如1,2,3,4,...,100,然后k=50,个数为c(100,50).果断 ...

  5. maven3 org.codehaus.plexus.classworlds.launcher.launcher 找不到或无法加载主类

    maven3 org.codehaus.plexus.classworlds.launcher.launcher 找不到或无法加载主类 嗯,网上很多资料说是路径的问题,确实是有可能是路径的问题,而且还 ...

  6. SQLServer判断一个IP是否在一个IP段里

    declare @ip1 varchar(20)declare @ip2 varchar(20)set @ip1='221.231.138.101'set @ip2='255.255.255.255' ...

  7. ShowModal 代码分析

    下面为Delphi中,方法TCustomForm.ShowModal的代码,通过分析以下代码,可以了解ShowModal到底是怎么一回事! 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  8. Django 基于Ajax & form 简单实现文件上传

    前端实现 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="U ...

  9. kettle连接资源库设置

    到这里你是登陆不上去的,需要创建或更新按钮,因为需要在你的数据库里创建关于kettle的数据表,来存储资源库 点执行就可以了 一般情况下kettle资源库自动给你创建两个用户: 工具->资源库- ...

  10. require.js vs browserify

    require.js vs browserify require.js是模块加载器:browserify是预编译工具 require.js遵循的是AMD规范:browserify遵循的是CommonJ ...