传送门

题目大意

给定$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. Node-Webkit - package.json - 参数设置

    必填: main :(string)APP的主入口,指定一个html文件,如:main:"index.htm". name :(string)APP的名称,必须具有唯一性. 例子: ...

  2. json:js和jquery中轻量级数据交换格式

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  3. 大组合取模之:1<=n<=m<=1e6,1<=p<=1e9

    /****************************** 大组合取模之:1<=n<=m<=1e6,1<=p<=1e9 使用:程序最开始调用getprime(),需要 ...

  4. 广告 竞价排名 import Levenshtein as Le seqratio_res = Le.seqratio(chk_name_lsit, cmp_)

    pip install python-Levenshtein from openpyxl import Workbook import xlrd import time import Levensht ...

  5. Virtualbox报错------> '/etc/init.d/vboxdrv setup'

    Ubuntu下VirtualBox本来可以很好地用的,今天早上一来就报错了,--提示如下内容: ---------------------------------------------------- ...

  6. 【android】在Service的onStartCommand()中调用stopself()应该注意的问题

    在Service的onStartCommand()中调用stopself()后并不会立马destroy掉service,而是等onStartCommand()运行完才destroy. public c ...

  7. docker 存储定义成direct-lvm 模式

    配置direct-lvm模式 1.  停止Docker systemctl stop docker 2.  安装依赖包 device-mapper-persistent-data,lvm2, and ...

  8. Function- 几个转换函数

    几个转换函数 SJIS_DBC_TO_SBC 全角转半角SJIS_SBC_TO_DBC 半角转全角 CLPB_IMPORT :从剪贴板导入internal tableCLPB_EXPORT : 从in ...

  9. .net序列化与反序列化——提供多次存储对象集后读取不完全解决方案

    ||问题: 文本文档读取序列化文件时只能读取第一次序列化对象或对象集,而多次序列化存到同一个文本文件中不能完全读取.最近做一个简单的学生管理系统,涉及到多次将学生对象序列化后追加存储到同一个文档中.在 ...

  10. 【leetcode刷题笔记】Edit Distance

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...