Atcoder2167 Blackout
Atcoder2167 Blackout
zjoi讲过的一道神题啊。。。
首先把每个黑点(a,b)看成一条有向边a->b,然后这个图就变成了一张有自环的有向图。
然后弱联通块就分开了,对于每个连通块搜一遍并且三染色(网上说就叫这个)。
三染色:给每个点一个0-2的权值,使得对于每一条边u->v,都有\((w_u+1)\mod 3=w_v\)
如果无法成功染色的话,这个联通块每两个点之间都有边,包括自环。
否则如果没有三个颜色都出现,这个联通块并不会增加边。
否则就可以成功染色,这时所有权值为0的点到权值为1的点,权值为1的点到权值为2的点,权值为2的点到权值为0的点之间都有边。
关于正确性的证明
emmm网上没几篇博客也不是很清楚叭
反正画张图推推没啥毛病(逃
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<vector>
using namespace std;
typedef int mmp;
#define vd void
#define rg register
#define il inline
#define sta static
il int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=1e5+1,maxm=maxn<<1;
int fir[maxn],dis[maxm],nxt[maxm],w[maxm],id;
il vd link(int a,int b,int c){nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;}
vector<int>S;
int col[maxn],faq[maxn],tot,yes[maxm];
il int fuck(int x){
while(x<1)x+=3;
while(x>3)x-=3;
return x;
}
il vd dfs(int x,int c){
if(col[x]){
if(c!=col[x])faq[x]=1;
return;
}
S.push_back(x);col[x]=c;
for(rg int i=fir[x];i;i=nxt[i]){
if(!yes[i])++tot,yes[i]=1;
dfs(dis[i],fuck(c+w[i]));
}
}
mmp main(){
int n=gi(),m=gi(),x,y;
while(m--){
x=gi(),y=gi();
link(x,y,1);
link(y,x,-1);
}
long long ans=0;
for(rg int i=1;i<=n;++i)
if(!col[i]){
tot=0;S.clear();
dfs(i,1);
int a[4]={0},d=0;
for(rg int i=0;i<S.size();++i){
if(faq[S[i]]){d=1;break;}
++a[col[S[i]]];
}
if(d)ans+=S.size()*S.size();
else if(a[1]==0||a[2]==0||a[3]==0)ans+=tot/2;
else ans+=1ll*a[1]*a[2]+1ll*a[2]*a[3]+1ll*a[3]*a[1];
}
printf("%lld\n",ans);
return 0;
}
Atcoder2167 Blackout的更多相关文章
- 【agc006f】Blackout(神仙题)
[agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...
- UVA10600:ACM Contest and Blackout(次小生成树)
ACM Contest and Blackout 题目链接:https://vjudge.net/problem/UVA-10600 Description: In order to prepare ...
- 2017国家集训队作业[agc006f]Blackout
2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...
- UVA 10600 ACM Contest and Blackout 次小生成树
又是求次小生成树,就是求出最小生成树,然后枚举不在最小生成树上的每条边,求出包含着条边的最小生成树,然后取一个最小的 #include <iostream> #include <al ...
- 【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
[题意] n个点,m条边,求最小生成树的值和次小生成树的值. InputThe Input starts with the number of test cases, T (1 < T < ...
- [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树
题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...
- uva 10600 ACM Contest And Blackout
题意: 求最小生成树和次小生成树的总权值. 思路: 第一种做法,适用于规模较小的时候,prim算法进行的时候维护在树中两点之间路径中边的最大值,复杂度O(n^2),枚举边O(m),总复杂度O(n^2) ...
- 【AGC006F】Blackout
Description 题目链接 Solution 首先,把输入矩阵看成邻接矩阵,将问题转化到图上. 现在的问题变成:给定一个有向图,如果存在\((u,v)\)和\((v,w)\),则连边\((w,u ...
- UVA-10600 ACM Contest and Blackout (次小生成树)
题目大意:给一张无向图,找出最小生成树和次小生成树. 题目分析:模板题...方法就是枚举所有的比最小生成树中两端点之间的最长边还要长的边,用它替换,再取一个最小的值便是次小生成树了. 代码如下: # ...
随机推荐
- 新建一个去除storyboard的项目
新建一个去除storyboard的项目 1. 新建项目并删除 *.storyboard 以及与之相关的杂项 2. 设置 UIWindow 的 rootViewController 复制粘贴代码如下 s ...
- Python学习---JSON补充内容[中文编码 + dumps解析]
JSON补充内容[微信解决中文乱码,接上] import json # 英文显示 dic = {"hello": "world"} str = json.dum ...
- Nodejs和npm入门使用
目录 引子 何为node.js 和 npm 怎么使用node.js和npm 安装node.js & npm npm init 初始化项目(创建node.js模块) Package.json 属 ...
- 关于Tomcat端口出现的问题
=Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. Th ...
- TreeMap:是基于红黑树的Map接口的实现
> TreeMap:是基于红黑树的Map接口的实现. 红黑树:平衡二叉树 取出时,可以有三种方式:前序遍历,中序遍历,后序遍历 >排序: A 自然排序 --TreeMap无参构造 Tre ...
- Altium制作DC002的PCB封装和3D模型
Altium制作DC002的PCB封装和3D模型 常用的电源连接器(Dc Power Jack Connector)DC002.DC005等等型号的3D模型在网上很难找到合适的,我们可以选择CUI 公 ...
- 从html代码里提取字符编码
#include <iostream>#include "regex"using namespace std;std::string str = R"( &l ...
- c++作业之圆面积
代码传送门
- Rabbitmq.md
RabbitMQ介绍 什么是RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面 ...
- [SCOI2007]组队
嘟嘟嘟 这题有人说部分分O(n3)暴力,然而我暴力都没写过,调了半天也没用……还是看题解吧 首先,咱把A * ( h – minH ) + B * ( s – minS ) <= C 变个型,得 ...