2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia

时间:2022-01-12 10:36:12

B - Cactusophobia

思路:

点双联通分量+最大流

用tarjan求出每个点双联通分量

对于大小大于1的点双联通分量,它就是个环,那么源点和这个环相连,

容量为环的大小减一,这个环和环上的颜色连边,容量为一;

对于大小为1的点双连通分量,它只有一条边,那么源点和这个分量连边,

分量和边上颜色连边,容量都为1

然后所有颜色和汇点连边,容量为1

最后跑一遍最大流就可以了

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e4 + , M = 4e4 + ;
const int INF = 0x7f7f7f7f;
vector<pii> G[N];
vector<int> bcc[N*];
int color[N*];
int low[N], dfn[N], stk[N*], tot = , top = , cnt = ;
int level[M], iter[M];
struct edge {
int to, w, rev;
};
vector<edge>g[M];
void add_edge(int u, int v, int w) {
g[u].pb(edge{v, w, g[v].size()});
g[v].pb(edge{u, , g[u].size()-});
}
void bfs(int s) {
mem(level, -);
queue<int>q;
level[s] = ;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = ; i < g[u].size(); i++) {
edge e = g[u][i];
if(e.w > && level[e.to] < ) {
level[e.to] = level[u] + ;
q.push(e.to); }
}
}
}
int dfs(int u, int t, int f) {
if(u == t ) return f;
for (int &i = iter[u]; i < g[u].size(); i++) {
edge &e = g[u][i];
if(e.w > && level[u] < level[e.to]) {
int d = dfs(e.to, t, min(f, e.w));
if(d > ) {
e.w -= d;
g[e.to][e.rev].w +=d;
return d;
}
}
}
return ;
}
int max_flow(int s, int t) {
int flow = ;
while(true) {
bfs(s);
if(level[t] < ) return flow;
int f;
mem(iter, );
while ((f = dfs(s, t, INF)) > ) {
flow += f;
}
}
}
void tarjan(int u, int fa) {
low[u] = dfn[u] = ++tot;
for (pii p : G[u]) {
int v = p.fi;
if(v == fa) continue;
if(!dfn[v]) {
stk[++top] = p.se;
tarjan(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]) {
cnt++;
while(stk[top] != p.se) bcc[cnt].pb(stk[top--]);
bcc[cnt].pb(stk[top--]);
}
}
else if(dfn[v] < dfn[u]) {
stk[++top] = p.se;
low[u] = min(low[u], dfn[v]);
}
}
}
int main() {
int n, m, u, v, c;
scanf("%d %d", &n, &m);
for (int i = ; i <= m; i++) {
scanf("%d %d %d", &u, &v, &color[i]);
G[u].pb(pii{v, i});
G[v].pb(pii{u, i});
}
tarjan(, );
int s = , t = cnt+m+;
for (int i = ; i <= cnt; i++) {
if(bcc[i].size() == )add_edge(s, i, );
else add_edge(s, i, bcc[i].size()-);
}
for (int i = ; i <= cnt; i++) {
for (int j : bcc[i]) {
add_edge(i, cnt+color[j], );
}
}
for (int i = ; i <= m; i++) add_edge(cnt+i, t, );
printf("%d\n", max_flow(s, t));
return ;
}

2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia的更多相关文章

  1. 2017 Russian Code Cup &lpar;RCC 17&rpar;&comma; Final Round

    2017 Russian Code Cup (RCC 17), Final Round A Set Theory 思路:原题转换一下就是找一个b数组,使得b数组任意两个数的差值都和a数组任意两个数的差 ...

  2. 2017 Russian Code Cup &lpar;RCC 17&rpar;&comma; Elimination Round D - Acute Triangles

    D - Acute Triangles 思路: 极角排序+点积叉积 在一个三角形中,如果它是直角或者顿角三角形,那么直角和顿角只会出现一次 所以直角和顿角三角形的个数等于直角和顿角的个数 所以锐角三角 ...

  3. &lbrack;Russian Code Cup 2017 - Finals &lbrack;Unofficial Mirror&rsqb;&rsqb;简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. Div1难度+ACM赛制  和几个大佬组队逛了逛 A.给一个大小为n的集合ai(1<=ai<=1000000),要求你构造一个大小 ...

  4. CF Intel Code Challenge Final Round &lpar;Div&period; 1 &plus; Div&period; 2&comma; Combined&rpar;

    1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort    暴力枚举,水 1.题意:n*m的数组, ...

  5. Yandex&period;Algorithm 2018&comma; final round

    Yandex.Algorithm 2018, final round A Smart Vending B LIS vs. LDS C Eat And Walk D Search Engine E Gu ...

  6. Google Code Jam Africa 2010 Qualification Round Problem B&period; Reverse Words

    Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words https://code.google.com/cod ...

  7. Lyft Level 5 Challenge 2018 - Final Round &lpar;Open Div&period; 2&rpar; &lpar;前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  8. 8VC Venture Cup 2016 - Final Round &lpar;Div&period; 2 Edition&rpar;

    暴力 A - Orchestra import java.io.*; import java.util.*; public class Main { public static void main(S ...

  9. 8VC Venture Cup 2016 - Final Round &lpar;Div&period; 1 Edition&rpar; E - Preorder Test 树形dp

    E - Preorder Test 思路:想到二分答案了之后就不难啦, 对于每个答案用树形dp取check, 如果二分的值是val, dp[ i ]表示 i 这棵子树答案不低于val的可以访问的 最多 ...

随机推荐

  1. IBM appscan 9&period;0破解版分享

    简介:IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评 ...

  2. css绘制六边形

    CSS id选择器实现 正六边形 用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: HTML代码: <div id="box1">&lt ...

  3. SciTE 文本编辑器

    个人一直使用,强大,轻型基于 Scintilla. http://www.scintilla.org/SciTEDownload.html 解压缩后,能右键文件打开 修改注册表, 使能资源管理器 右键 ...

  4. javascript中的变量作用域以及变量提升详细介绍

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...

  5. ANDROID&lowbar;MARS学习笔记&lowbar;S04&lowbar;008&lowbar;用Listview、自定义adapter显示返回的微博数据

    一.简介 运行结果 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"? ...

  6. 提高PHP编程效率的方法

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...

  7. 查询集API -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  8. 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  9. Leetcode解题思路总结(Easy篇)

    终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...

  10. PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4&period;0&period;0),目前只能java生成】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个是<PoiDemo[Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)]>的扩展,上一篇是根 ...