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$成立 求,最少再证明多少次,就可以完 ...
随机推荐
- HashMap的一些学习
1.equals和==的对比==用于比较引用和比较基本数据类型时具有不同的功能:A:比较基本数据类型,如果两个值相同,则结果为true而在比较引用时,如果引用指向内存中的同一对象,结果为true; e ...
- ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
原文:https://www.stevejgordon.co.uk/httpclientfactory-using-polly-for-transient-fault-handling发表于:2018 ...
- java - CAS及CAS底层原理
CAS是什么? CAS的全称为Compare-And-Swap它是一条CPU并发原语,也就是在CPU硬件层面上来说比较并且判断是否设置新值这段操作是原子性的,不会被其他线程所打断.在JAVA并发包ja ...
- python笔记07
今日内容 深浅拷贝(面试) 文件操作 今日内容 深浅拷贝 v1=[1,2,[34,67,9]] import copy 浅拷贝: 拷贝第一层 v2=copy(v1)---将v1的地址copy,最外层壳 ...
- Python入门11 —— 基本数据类型的操作
一:数字类型:int.float字类型 1.操作: 比较运算:int与float之间是可以比较大小 数学运算:+-*/,int与float之间也可以进行数学运算 print(10 > 3.1) ...
- Python-Django学习笔记(一)-MTV设计模式
Django是开源的.大而且全的Web应用框架. 它独具特色,采用了MTV设计模式. MTV框架包括:Model(模型).Template(模板)和View(视图) Model(模型):负责业务对象与 ...
- nginx ip配置反向代理为本地域名
#### gitlab反向代理 server { listen ; server_name gitlab.hp.com; location / { proxy_pass http://192.168. ...
- vs2019清空输入缓冲区
发现用cin.sync()在vs2019中不能清空输入缓冲区,以前的vs版本没试过,我看别人在vc中用cin.sync()可以清除,估计是IDE的问题..以下是我学习C++四个多月写的一整段代码 运行 ...
- mysql行级锁 select for update
mysql行级锁 select for update 1.属于行级锁 2.where条件后需要写出明确的索引条件(如果有多个条件,可以建立联合索引) 3.如果其所在的事务提交或者回滚后,或者更新该条数 ...
- Jquery change方法
jQuery 事件 - change() 方法 当输入域发生变化时改变其颜色: $(".field").change(function(){ $(this).css("b ...