Description

有一张带点权有向图,你要在其中修建若干个检查站,使得对于每一个点 \(p\) ,都有 \(\geq 1\) 个检查站,满足:

  1. 存在一条从这个检查站出发到点 \(p\) 的路径;
  2. 存在一条从点 \(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;
}

最新文章

  1. 怎么使用jQuery
  2. hadoop环境搭建
  3. 谈谈Java程序员进阶的那些知识和方向
  4. Java字节流:ByteArrayInputStream ByteArrayOutputStream
  5. appid 评价
  6. Codeforces Round #371 (Div. 2) C. Sonya and Queries
  7. 页面分享代码share
  8. eclipse中tomcat加gc日志输出
  9. JFinal之学习资源
  10. 大设计时代:针对超大网页布局的一些思考和建议 [Aseoe]
  11. noip 2005 等价表达式
  12. Bzoj2034 2009国家集训队试题 最大收益 贪心+各种优化+二分图
  13. Struts2-2.了解struts.xml的查找顺序
  14. PHP生成静态页面详解
  15. 实现一个javascript手势库 -- base-gesture.js
  16. Redis 学习笔记-应用场景
  17. Spring Boot实战之数据库操作
  18. C语言程序设计预备作业。
  19. orcal10g下载地址
  20. kvm虚拟机日常操作命令梳理

热门文章

  1. excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容
  2. Linux云计算-01_介绍以及Linux操作系统安装
  3. hive学习笔记之十:用户自定义聚合函数(UDAF)
  4. Sql Server 查询正在执行的sql信息和锁定事务
  5. AcWing 242. 一个简单的整数问题
  6. linux学习之路第三天
  7. 网络编程+Python
  8. ctf实验吧天网管理系统
  9. Android布局方式总结
  10. 使用 Java 和 Maven (JBake) 生成静态网站