2016 Russian Code Cup (RCC 16), Final Round 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的更多相关文章
- 2017 Russian Code Cup (RCC 17), Final Round
2017 Russian Code Cup (RCC 17), Final Round A Set Theory 思路:原题转换一下就是找一个b数组,使得b数组任意两个数的差值都和a数组任意两个数的差 ...
- 2017 Russian Code Cup (RCC 17), Elimination Round D - Acute Triangles
D - Acute Triangles 思路: 极角排序+点积叉积 在一个三角形中,如果它是直角或者顿角三角形,那么直角和顿角只会出现一次 所以直角和顿角三角形的个数等于直角和顿角的个数 所以锐角三角 ...
- [Russian Code Cup 2017 - Finals [Unofficial Mirror]]简要题解
来自FallDream的博客,未经允许,请勿转载,谢谢. Div1难度+ACM赛制 和几个大佬组队逛了逛 A.给一个大小为n的集合ai(1<=ai<=1000000),要求你构造一个大小 ...
- CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort 暴力枚举,水 1.题意:n*m的数组, ...
- Yandex.Algorithm 2018, final round
Yandex.Algorithm 2018, final round A Smart Vending B LIS vs. LDS C Eat And Walk D Search Engine E Gu ...
- Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words
Google Code Jam Africa 2010 Qualification Round Problem B. Reverse Words https://code.google.com/cod ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)
暴力 A - Orchestra import java.io.*; import java.util.*; public class Main { public static void main(S ...
- 8VC Venture Cup 2016 - Final Round (Div. 1 Edition) E - Preorder Test 树形dp
E - Preorder Test 思路:想到二分答案了之后就不难啦, 对于每个答案用树形dp取check, 如果二分的值是val, dp[ i ]表示 i 这棵子树答案不低于val的可以访问的 最多 ...
随机推荐
- 在IOS应用中打开另外一个应用的解决方案
最近要在IOS中实现一个应用启动另外一个应用的功能,搜了一些资料,使用UIApplication的openURL:的方法就能实现,现在整理和大家分享一下! 注册自定义URL协议 首先被启动的应用需要向 ...
- [redis] hiredis-vip 简单使用
redis的C语言client,有几个:https://redis.io/clients#c 支持cluster的只有一个唯品会的版本:https://github.com/vipshop/hired ...
- 学习笔记:Makefile的ifeq逻辑或,逻辑与的变通实现
(1)ifeq的用法 ifeq ($(变量名), 变量值 ) ........ else ifeq ($(..), ..) ......... else ......... endif (2) ...
- javaweb(2)之Servlet入门
Hello Servlet 方式一 1.新建 web 工程,编写一个类,实现 javax.servlet.Servlet 接口: package com.zze.servlet; import jav ...
- 安装和使用ZFS
一.安装和使用ZFS Centos7上安装和使用ZFS:https://blog.csdn.net/linuxnews/article/details/51286358
- cherry-pick时的add by us / both modified / delete by us /delete by themk
简单来说: us=into , them=from 比如你将test分支的某个提交cherry-pick到master分支上,那么us就是master分支,them 就是test分支 参考: http ...
- 初识github之项目创建
登录github后,点击左上角logo章鱼猫,进入主页面,点击start a project ,此时进入新建项目的页面.在repostory name这一栏上写下你想创建的项目的名字.然后在descr ...
- Alpha阶段敏捷冲刺日志的集合贴
敏捷冲刺日志的集合贴 Day1(4.17):http://www.cnblogs.com/software-teamwork/p/8861426.html Day2(4.20):http://www. ...
- RAMPS1.4 3d打印控制板接线与测试
“工欲善其事,必先利其器”,在开始工作之前,你应该准备下面所说的工具(包括软件和硬件). 1.需要下载的软件 1.1 固件上传工具——Arduino IDE 这是上传固件的必备工具,有了这个软件让上传 ...
- 学习使用scrapy itemspipeline过程
开始非常不理解from https://www.jianshu.com/p/18ec820fe706 找到了一个比较完整的借鉴,然后编写自己的煎蛋pipeline 首先在items里创建 image_ ...