codeforce 427 C. Checkposts(tarjan 强连通分量)
题目链接:http://codeforces.com/contest/427/problem/C
题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在junction上建立Checkposts,而且建立checkposts需要花费cost,如果某个点 i 建立了checkpost那么从这个点 i 开始绕一个环最终可以回到点 i ,那么途中经过的点都可以被监视到,问最少花费多少钱去建立checkposts才可以监视所有的junctions,建立checkposts的方案有多少种?
题解思路:刨析题意就是让你求有多少个强连通分量,用tarjan依次跑出每个强连通分量包含的点集,找出该集合中建立checkposts的最小花费,再求一下可以用最小花费建checkpost的junction的个数,最终的方案书就是每个强连通分量的 最小花费建checkpost的junction的个数连乘,最小花费就简单了,求一个强连通分量就加一下最小花费即可。
AC代码:
#include<iostream>
#include<stack>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
vector<int> vex;
int cost;
};
node g[3000008];
int dfn[3000008];
int low[3000008];
int visit[3000008];
stack<int> stk;
vector<int> sum;
long long int Fcost = 0;
int tot ;
long long int mod = 1e9+7;
void tarjan(int x){
dfn[x] = low[x] = ++tot;
visit[x] = 1;
stk.push(x);
for(int i = 0;i<g[x].vex.size();i++ ){
if(!dfn[g[x].vex[i]]){
tarjan(g[x].vex[i]);
low[x] = min(low[x],low[g[x].vex[i]]);
}
else if(visit[g[x].vex[i]]){
low[x] = min(low[x],dfn[g[x].vex[i]]);
}
}
if(low[x] == dfn[x]){//找到一个强连通分量
int cnt = 1;
int Tcost = 0x3f3f3f3f;
while(x!=stk.top()){
visit[stk.top()] = 0;
if(g[stk.top()].cost < Tcost){
cnt = 1;//从这个强连通分量中找最小花费
Tcost = min(Tcost,g[stk.top()].cost);
}
else if(g[stk.top()].cost == Tcost){
cnt++;//记录最小花费点的个数
}
stk.pop();
}
visit[stk.top()] = 0;
if(g[stk.top()].cost < Tcost)
{
cnt = 1;
Tcost = min(Tcost,g[stk.top()].cost);
}
else if(g[stk.top()].cost == Tcost)
{
cnt++;
}
stk.pop();//这里是弹出栈内最后一个强连通分量的点
Fcost = (Fcost + Tcost);//Fcost是总花费
sum.push_back(cnt); //记录每个强连通分量的可以用最小花费点建立checkpost的个数
}
}
int main(){
int n;
cin>>n;
for(int i = 1;i<=n;i++){
int costI;
cin>>costI;
g[i].cost = costI;
}
int m;
cin>>m;
for(int i = 1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].vex.push_back(v);
}
for(int i = 1;i<=n;i++){//tarjan的板子,直接套一下
if(!dfn[i]){
tarjan(i);
}
}
long long int res = 1;
for(int i = 0;i<sum.size();i++){
res = (res*sum[i])%mod;
}
cout<<Fcost<<" "<<res;
return 0;
}
codeforce 427 C. Checkposts(tarjan 强连通分量)的更多相关文章
- Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
题目:http://codeforces.com/problemset/problem/427/C 题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- tarjan 强连通分量
一.强连通分量定义 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly c ...
- tarjan强连通分量模板(pascal)
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...
- 1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)
题目大意:CodeVs2822的简单版本 传送门 $Tarjan$强连通分量+缩点,若连通块的个数等于一则输出n:若缩点后图中出度为0的点个数为1,输出对应连通块内的点数:否则输出0: 代码中注释部分 ...
- [poj 2553]The Bottom of a Graph[Tarjan强连通分量]
题意: 求出度为0的强连通分量. 思路: 缩点 具体有两种实现: 1.遍历所有边, 边的两端点不在同一强连通分量的话, 将出发点所在强连通分量出度+1. #include <cstdio> ...
- [poj 1904]King's Quest[Tarjan强连通分量]
题意:(当时没看懂...) N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一 ...
- 算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...
- Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量
题意: 给一些集合 要求证明所有集合是相同的 证明方法是,如果$A∈B$,$B∈A$那么$A=B$成立 每一次证明可以得出一个$X∈Y$ 现在已经证明一些$A∈B$成立 求,最少再证明多少次,就可以完 ...
随机推荐
- Linux下安装python,mysql,redis
linux 安装Python3 1.python下载 请在终端输入如下命令: cd /home wget http://cdn.npm.taobao.org/dist/python/3.6.5/Pyt ...
- Python之xlrd模块读取xls文件与报错解决
安装 pip3 install xlrd 用法 Sheet编号从0开始 rows,colnum编号均从0开始 合并的单元格仅返回第一格内容 Sheets只能被调用一次,可获取所有sheet取idx 无 ...
- PHP目录操作(附封装好的目录操作函数文件)
目录函数库常用API $path='test'; var_dump(is_dir($path));//检测是否为目录 echo '<hr/>'; echo getcwd();//得到当前的 ...
- react-native构建基本页面3---路由配置
安装路由 运行yarn add react-native-router-flux 路由官网 路由相关配置 路由简单的DEMO // Main 才是项目的根组件 import React, { Comp ...
- 【Unity|C#】基础篇(12)——反射(Reflection)(核心类:Type、Assembly)
[学习资料] <C#图解教程>(第24章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- linux 配置compoer
配置默认php 删除 rm -f /usr/bin/php 改到php7.3版本的composer /bin/php /usr/bin/php 多版本支持 配置php7专用composer70 cd ...
- 记录 shell学习过程(10 ) shell 对文件的操作
0.sed 常用内部命令 a 在匹配后面添加 i 在匹配前面添加 p 打印 d 删除 s 查找替换 c 更改 y 转换 N D P 下面用a来演示 1.sed 'a 追加内容' 文件 # sed 'a ...
- 文本中自动出现的 ​
文本中自动出现的 ​ 所借鉴原页面地址:https://blog.csdn.net/judyc/article/details/53097142 因判断容器内字符长度来做其它处理 ...
- SpringBoot整合WEB开发--(五)自定义错误页
目的与原理: 处理异常时,若我们想根据实际情况返回不同的页面,@ControllerAdvice与@ExceptionHandler,一般用于处理应用级别的异常,一些容器级别的错误就处理不了,例如Fi ...
- 马走日的解法(dfs)
马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...