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的更多相关文章

  1. 【agc006f】Blackout(神仙题)

    [agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...

  2. UVA10600:ACM Contest and Blackout(次小生成树)

    ACM Contest and Blackout 题目链接:https://vjudge.net/problem/UVA-10600 Description: In order to prepare ...

  3. 2017国家集训队作业[agc006f]Blackout

    2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...

  4. UVA 10600 ACM Contest and Blackout 次小生成树

    又是求次小生成树,就是求出最小生成树,然后枚举不在最小生成树上的每条边,求出包含着条边的最小生成树,然后取一个最小的 #include <iostream> #include <al ...

  5. 【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)

    [题意] n个点,m条边,求最小生成树的值和次小生成树的值. InputThe Input starts with the number of test cases, T (1 < T < ...

  6. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树

    题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...

  7. uva 10600 ACM Contest And Blackout

    题意: 求最小生成树和次小生成树的总权值. 思路: 第一种做法,适用于规模较小的时候,prim算法进行的时候维护在树中两点之间路径中边的最大值,复杂度O(n^2),枚举边O(m),总复杂度O(n^2) ...

  8. 【AGC006F】Blackout

    Description 题目链接 Solution 首先,把输入矩阵看成邻接矩阵,将问题转化到图上. 现在的问题变成:给定一个有向图,如果存在\((u,v)\)和\((v,w)\),则连边\((w,u ...

  9. UVA-10600 ACM Contest and Blackout (次小生成树)

    题目大意:给一张无向图,找出最小生成树和次小生成树. 题目分析:模板题...方法就是枚举所有的比最小生成树中两端点之间的最长边还要长的边,用它替换,再取一个最小的值便是次小生成树了. 代码如下: # ...

随机推荐

  1. c# 托管和非托管的介绍

    在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解.net CLR如何做这些操作.也就是说 ...

  2. Azure Document DB Repository 的实现

    阅读 需要大约  5 分钟. 前景: Azure Cosmos DB 由 Microsoft 提供,是全球分布式多模型数据库. 通过 Azure Cosmos DB 跨任意数量的 Azure 地理区域 ...

  3. 使用SDWebImage淡入淡出的方式加载图片

    使用SDWebImage淡入淡出的方式加载图片 效果: 请通过以下方式下载源码: 找到它修改文件的地方: 以下是使用源码: // // ViewController.m // SDWebImageFa ...

  4. Git使用本地仓库之基本操作

    1.Git是什么? 一个分布式版本控制系统,和SVN类似,但远比SVN强大的一个版本控制系统 ①Git可以方便的在本地进行版本管理,如同你本地有一个版本管理服务器一样我们可以选择在合适的时间将本地版本 ...

  5. redis几种数据类型以及使用场景

    1. string类型 string为最简单类型,一个key对应一个value set mykey "wangzai" ##设置key,第二次赋值会直接覆盖之前的 setnx my ...

  6. 1. 安装Oracle,配置环境 2. 实现查询From子句 3. 实现查询where子句 4. 实现查询order by子句

    一.环境安装1. 登录:以管理员身份登录 sqlplus 登录名/密码 管理员身份登录:sqlplus system/1234562. 登录后,导入案例.下载scott.sql文件,执行下面一行的命令 ...

  7. fun() 的 拆分和 for 遍历 的结合---------> 函数容器

    fun() 的 拆分和 for 遍历 的结合--------->  函数容器

  8. Python中网络编程对socket accept函数的理解

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept),这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回一个新的套接字, ...

  9. leetcode 141. Linked List Cycle 、 142. Linked List Cycle II

    判断链表有环,环的入口结点,环的长度 1.判断有环: 快慢指针,一个移动一次,一个移动两次 2.环的入口结点: 相遇的结点不一定是入口节点,所以y表示入口节点到相遇节点的距离 n是环的个数 w + n ...

  10. java多线程之Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...