Atcoder Grand 011 C - Squared Graph
题意:
给出一个n个点的图,现在构造一个有n^2个点的新图,新图每个点表示为(a,b)(a,b<=n),两个点$(a,b),(c,d)$之间有边当且仅当原图中ac之间有边,bd之间有边。
问新图中有几个联通块。
第一眼看上去似乎很不可做,想一想新图中两个点$(a,b),(c,d)$在同一个联通块其实就是原图中放着两个棋子,一个在a,一个在b,两个棋子同时走相同步后第一个棋子在c,第二个在d。
先考虑两个棋子在原图同一个联通块里的情况,如果这个联通块有奇环,那么这个联通块里所有点对在新图中是一个联通块,否则是两个,大概就是同时从黑\白点走或者从一黑一白走。
如果两个棋子在原图中不同联通块里,那么如果两个联通块中都没有奇环,那么形成两个联通块,否则形成一个。
需要特判原图中联通块大小为1的情况。
#include<bits/stdc++.h>
#define N 400005
#define ll long long
using namespace std;
int n,m;
int head[N],ver[N],nxt[N],tot;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int v[N];
int cnt,flag,sz,szz,tp;
void dfs(int x,int c)
{
cnt++;v[x]=c;
for(int i=head[x];i;i=nxt[i])
{
if(v[ver[i]]==-1)dfs(ver[i],c^1);
else if(v[ver[i]]!=(c^1))flag=1;
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int t1,t2;
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
ll ans=0;memset(v,-1,sizeof(v));
for(int i=1;i<=n;i++)
{
cnt=0;flag=0;
if(v[i]==-1)dfs(i,0);
if(cnt)
{
if(flag||cnt==1)ans++;
else ans+=2;
if(cnt==1)tp++;
else
{
if(!flag)szz++;
sz++;
}
}
}
ans+=1LL*2*tp*(n-1);
ans-=1LL*tp*(tp-1);
ans+=1LL*sz*(sz-1);
ans+=1LL*szz*(szz-1);
cout<<ans<<endl;
return 0;
}
Atcoder Grand 011 C - Squared Graph的更多相关文章
- 【AtCoder】AGC011 C - Squared Graph
题解 大意是给出一张图,然后建一张新图,新图的点标号是(a,b) 如果a和c有一条边,b和d有一条边,那么(a,b)和(c,d)之间有一条边 我们把这道题当成这道题来做,给出两张图,如果第一张图有边( ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
随机推荐
- 20155222卢梓杰 实验五 MSF基础应用
实验五 MSF基础应用 1.一个主动攻击实践,如ms17_010_eternalblue漏洞; 本次攻击目标是win7虚拟机 首先进行相应配置 然后点launch 就成功了 针对win7的漏洞还是相对 ...
- USART_GetITStatus和USART_GetFlagStatus的区别
USART_GetITStatus()和USART_GetFlagStatus()的区别 都是访问串口的SR状态寄存器,唯一不同是,USART_GetITStatus()会判断中断是否开启,如果没开启 ...
- [CF1039E]Summer Oenothera Exhibition[根号分治+lct]
题意 给一个长度为 \(n\) 的序列, \(q\) 次询问,次给一个 \(k_i\) ,问最少将序列划分成多少次,满足每一段的极差不超过\(w−k_i\). \(1 \leq n, q \leq 1 ...
- OD之绕过序列号验证(二)
上次是修改程序的标题,大家应该感觉这只是一个起点而已,接下来我们可以尝试绕过序列号验证,这种技术应用在很多软件中,比如淘宝上要买什么的软件,商家都会发给`你一个用户名和密码,而且还有试用期什么的,这确 ...
- java代码求阶乘n!
面试过程中总是遇到要求写一段Java代码求阶乘.下面就是就是两种求阶乘 n! 的方法: 1.使用递归求解n! public int doFactorial(int n){ if(n<0){ re ...
- 初识kibana
前言: 什么是Kibana?? Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的.你可以用kibana搜索.查看.交互存放在Elasticsearch索引里 ...
- float和position的使用
http://blog.csdn.net/yaodebian/article/details/58621183
- 重温jsp③
Jsp详细 九大内置对象 Out jsp的输出流,用来向客户端响应 page 当前jsp对象!他的引用类型是object,即真身中有如下代码:object page=this: Session h ...
- 圆桌的项目Alpha冲刺——测试
测试工作安排 作为一个测试计划来讲,核心的三个要素是时间,资源,范围.时间就是什么时候做以及要花多久做,资源就是你要调用的人力.机器等资源,范围是你要测试的东西以及测试重点. 时间:每天完成相应的模块 ...
- Parameter not found的出现的原因
with dataM.Q_xfgl_dhjf do begin close; sql.Clear; sql.Add('insert into jfdh(jfdh_id, ...