[agc011C]Squared Graph-[二分图]
Description
Solution
我们以下考虑的情况都是原图中非孤立的点。
题目要求新图的连通块个数。这个不好算,我们考虑计算新图的联通块内的特征点(x,y),即无法通过移动找到(t,c)使得t<x,也无法找到点(x,a)满足a<y。(就是字典序最小吧)可知每个新图连通块内,都有且只会有1个特征点。这两者就等价。
对于新图的点(x,y),假如x,y所在原图连通块已确定,则第一纬度的x一定要是其所在原图联通块的最小编号点。第二维度y的话,如果y所在原图连通块是二分图,则y在被二分出来的两个点集中分别选择最小的点,都是满足要求的。(否则的话,第二维度y只能选其所在连通块内的最小编号点)
直接统计即可。(孤立点的计数。。em这个就比较好推,我就不赘述啦)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int M=2e5+,N=1e5+;
int n,m,x,y;
struct pas{int y,nxt;
}g[M<<];int h[N],tot;
bool vis[N];int f[N];
int t1,t2,t3;
void cover(int x)
{
vis[x]=;
for (int i=h[x];i;i=g[i].nxt) if (!vis[g[i].y]) cover(g[i].y);
}
bool dfs(int x)
{
vis[x]=;
bool ret=;
int i;
for (i=h[x];i;i=g[i].nxt)
if (!vis[g[i].y]){ f[g[i].y]=f[x]^;if (!dfs(g[i].y)) {ret=;break;}}
else if (f[g[i].y]==f[x]) {ret=;break;}
for (;i;i=g[i].nxt) cover(g[i].y);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[++tot]=pas{y,h[x]};h[x]=tot;
g[++tot]=pas{x,h[y]};h[y]=tot;
}
for (int i=;i<=n;i++)
{
if (!h[i]) t1++;
else if (!vis[i]) if (dfs(i)) t2++;else t3++;
}
ll ans;
ans=1ll*t1*t1+2ll*t1*(n-t1)+2ll*t2*t2+2ll*t2*t3+1ll*t3*t3; printf("%lld",ans);
}
[agc011C]Squared Graph-[二分图]的更多相关文章
- AGC011-C Squared Graph
题意 给定一个\(n\)个点\(m\)条边的图,构建一个\(n^2\)个点的图,新图的每个点都可以看成一个二元组,新图上的点\((a,b)和(a′,b′)\)之间有边,当且仅当原图中\((a,a′), ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)
题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...
- POJ2125 Destroying The Graph 二分图 + 最小点权覆盖 + 最小割
思路来源:http://blog.csdn.net/lenleaves/article/details/7873441 求最小点权覆盖,同样求一个最小割,但是要求出割去了那些边, 只要用最终的剩余网络 ...
- POJ 2125 Destroying The Graph 二分图 最小点权覆盖
POJ2125 题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值.问最小权值和的解决方案,要输出操作. ...
- Codeforces.542E.Playing on Graph(二分图)
题目链接 \(Description\) 给出一个n个点m条边的无向图. 你每次需要选择两个没有边相连的点,将它们合并为一个新点,直到这张图变成了一条链. 最大化这条链的长度,或输出无解. n< ...
- 【AtCoder】AGC011 C - Squared Graph
题解 大意是给出一张图,然后建一张新图,新图的点标号是(a,b) 如果a和c有一条边,b和d有一条边,那么(a,b)和(c,d)之间有一条边 我们把这道题当成这道题来做,给出两张图,如果第一张图有边( ...
- Agc011_C Squared Graph
传送门 题目大意 给定$n$个点$m$条边的简单图(无重边无自环),将有序点对$\{a,b\}$作为新的点,新产生的$n^2$个点中对于两个点,$\{a,b\},\{x,y\}$,当且仅当原图中存在边 ...
- Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph (二分图染色)
题意:有\(n\)个点,\(m\)条边的无向图,可以给每个点赋点权\({1,2,3}\),使得每个点连的奇偶不同,问有多少种方案,答案对\(998244353\)取模. 题解:要使得每个点所连的奇偶不 ...
随机推荐
- Java Web工程搭建方法
搭建一个简单的Web工程主要是以下几步: 一.下载所需工具 ①java ②eclipse ③tomcat 注意:java与eclipse版本不匹配(32位或者64位),会导致eclipse启动时 ...
- 风险指针(Hazard Pointer) 内存空间共享模型
WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...
- pages bookmarks for machine learning domain
http://www.ai-start.com/dl2017/html/lesson4-week2.html 达叔深度学习笔记 http://cs231n.github.io/convolution ...
- Java 如何启用 ARM 虚拟机诊断
现象描述 如何通过 Java 语言实现在创建 ARM 虚拟机时开启诊断,并配置相关指标. 实现思路 调研最高版本的 JAVA SDK(1.1.0)源码发现,SDK 层面并未提供任启动诊断和配置诊断 ...
- xp_readerrorlog与sp_readerrorlog
SQL SERVER 可以使用xp_readerrorlog 或者sp_readerrorlog来查看错误日志. xp_readerrorlog 一共有七个参数: 1. 存档编号 2. 日志类型(1为 ...
- windows10操作系统中cmd窗口下telnet功能失效的解决方案
查找windows自带功能,在window10中相当方便.打开windows10的设置面板,在搜索栏中搜索“windows功能”,弹出以下界面: 根据弹出的提示“启动或停用windows功能”即可弹出 ...
- 分享-结合demo讲解JS引擎工作原理
代码如下: var x = 1; function A(y){ var x = 2; function B(z){ console.log(x+y+z); } return B; } var C = ...
- Math.min() / Math.max() 使用方法
首先弄懂apply 和 call 都是js函数自带的方法.区别如下: apply和call的用法只有一个地方不一样,除此之外,其他地方基本一模一样 1. a.call(b,arg1,arg2…) 2. ...
- webstorm 2017 激活
参考:https://blog.csdn.net/wangyingwing/article/details/79119592
- Linux 平台下的漏洞扫描器 Vuls
导读 Vuls 是一款适用于 Linux/FreeBSD 的漏洞扫描程序,无代理,采用 Go 语言编写,对于系统管理员来说,每天必须执行安全漏洞分析和软件更新都是一个负担. 为避免生产环境宕机,系统管 ...