CF427C题解
Description
有一张带点权有向图,你要在其中修建若干个检查站,使得对于每一个点 \(p\) ,都有 \(\geq 1\) 个检查站,满足:
- 存在一条从这个检查站出发到点 \(p\) 的路径;
- 存在一条从点 \(p\) 出发到这个检查站的路径。
求出修建检查站的点权和的最小值,以及当点权和有最小值时的修建方案数。
Solution
对于每个强连通分量,只需要修建 \(1\) 个检查站。
所以可以考虑缩点,这样最小点权和就是每个强连通分量中最小点权之和。
至于修建方案数,可以考虑乘法原理。总方案数等于每个强连通分量中方案数的乘积。
而每个强连通分量的方案数就是强连通分量中点权等于最小点权的点的个数。
然后这道题目就愉快地做完了。
using std::vector;
struct Edge {
ll to, nex;
} e[1000010];
ll dfn[1000010], low[1000010], dfncnt;
ll s[1000010], in_stack[1000010], tp;
ll belong[1000010], sc, sz[1000010];
ll head[1000010], cnt;
ll ans = 1, ans2;
ll val[1000010];
vector<ll> scc[1000010];
void add(ll u, ll v) {
e[++cnt].to = v;
e[cnt].nex = head[u];
head[u] = cnt;
}
void tarjan(ll u) {
low[u] = dfn[u] = ++dfncnt;
s[++tp] = u, in_stack[u] = 1;
for(ll i = head[u]; i; i = e[i].nex) {
ll v = e[i].to;
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if(in_stack[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if(dfn[u] == low[u]) {
ll it = 0;
++sc;
while(s[tp] != u) {
belong[s[tp]] = sc;
sz[sc]++;
in_stack[s[tp]] = 0;
scc[sc].push_back(val[s[tp]]);
--tp;
}
belong[s[tp]] = sc;
sz[sc]++;
in_stack[s[tp]] = 0;
scc[sc].push_back(val[s[tp]]);
--tp;
std::sort(scc[sc].begin(), scc[sc].end());
rep(i, 0, sz[sc] - 1) if(scc[sc][i] == scc[sc][0]) ++it;
ans = ans * it % 1000000007ll;
ans2 += scc[sc][0];
}
}
int main() {
ll n, m;
read(n);
rep(i, 1, n) read(val[i]);
read(m);
rep(i, 1, m) {
ll x, y;
read(x), read(y);
add(x, y);
}
rep(i, 1, n) if(!dfn[i]) tarjan(i);
print(ans2), putchar(' '), print(ans);
return 0;
}
CF427C题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 为了提高开发效率,我实现了 uTools 的超级面板
前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...
- USB上位机通信:CyAPI
至今的工作中,有USB接口通信的需求,记录一下. 建立一个USB设备对象 CCyUSBDevice *USBDevice = new CCyUSBDev(Handle): 打开USB设备 一个USB设 ...
- 基于C#的socket编程的TCP同步实现
该博客源著地址https://www.cnblogs.com/sunev/archive/2012/08/05/2604189.html 一.摘要 总结一下基于C#的TCP传输协议的涉及到的常用方法及 ...
- 利用C语言判别输入数的位数并正逆序输出
利用C语言判别用户输入数的位数并正逆序输出 #include <stdio.h> void main() { int i, scanfNum, printfNum, temp ...
- Zookeeper:Windows下Zookeeper启动zkServer.cmd闪退问题
Zookeeper在Windows下启动只需要运行zkServer.cmd双击即可(需保证运行环境中正确安装了Java运行环境) 但是在有的时候会出现双击闪退的情况.针对闪退,可按照如下方法进行解决: ...
- Mybatis学习(5)与spring3集成
在这一系列文章中,前面讲到纯粹用mybatis 连接数据库,然后 进行增删改查,以及多表联合查询的的例子,但实际项目中,通常会用 spring 这个沾合剂来管理 datasource 等.充分利用sp ...
- php 扩展kafka
一.安装librdkafka cd /usr/local/src/ git clone https://github.com/edenhill/librdkafka.git cd librdkafka ...
- GO系列-ioutil包
ioutil包提供给外部使用的一共有1个变量,7个方法. // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情 // 并且始终成功返回. var Disca ...
- 详解Spring中Bean的作用域与生命周期
摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...
- 『与善仁』Appium基础 — 1、Android系统的测试环境搭建
目录 1.Android操作系统简介 (1)Android系统诞生 (2)Android系统的结构 (3)Android测试环境搭建整体思路 2.Java环境安装 (1)JDK8下载 (2)安装JDK ...