Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)
题目:http://codeforces.com/problemset/problem/427/C
题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护还有通过这个点所连着的边走出去后面还能走回来的点,也就是这两个点能互相到达,那么
那个点也受到保护,每个城市设置检查点有一个权值,问你权值最小,并输出那个方案的个数有多少个
思路:我们既然是求两个点能互相到达,这其实有个名词叫强连通,如果两个点满足强连通的话,那么他们之间就只用选一个点即可,所以我们就知道,
我们用tarjan求强连通分量,然后在每个分量里面选最小的那个值累加即可,方案数的话,我们每个分量里面最优是取最小值才是最优的,所以我们求每个分量里面最小值的个数有多少个,然后累乘
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#define mod 1000000007
using namespace std;
const int MAXN = ;
struct Node
{
int next1,c;
}edge[MAXN];
int head[MAXN];
int dfn[MAXN],low[MAXN];
int vis[MAXN],stact[MAXN];
int tot,cnt,index;
int a[MAXN];
long long flag=;
long long sum=;
void add(int xx,int y) //前向星
{
edge[++cnt].next1 = head[xx];
edge[cnt].c = y;
head[xx] = cnt;
} void Tarjan(int x)
{
dfn[x] = low[x] = ++tot; //这里也不可以是0,因为0表示还没有开始深搜,要从1开始
vis[x] = ;stact[++index] = x;//注意这里的stact中的0位置是什么都不能储存的,因为后面要去判断栈中直到某一个数全部输出,所以要到达他的后一个位置,所以不能是0
for(int i = head[x];i != -; i = edge[i].next1)//找到这个点的全部变
{
int v = edge[i].c;
if(!dfn[v]) //如果还没有深搜过这个点
{
Tarjan(v);
low[x] = min(low[x],low[v]);
}
else if(vis[v]) //如果这个点已经在栈中了,那么正在遍历的这个点的low就要指向他的父亲节点,也就是小的那个
low[x] = min(low[x],dfn[v]); //比较谁是谁的儿子
}
if(low[x] == dfn[x]) //表示在x之后在都在一个连通分量里面,所以要全部输出
{
long long mn=;
map<int,int> mp;
do{
//printf("%d ",stact[index]);
mn=min(mn,(long long)a[stact[index]]);
mp[a[stact[index]]]++;
vis[stact[index]] = ;
index -- ;
}while(x != stact[index+]);
sum=sum+mn;
flag=(flag*mp[mn])%mod; }
return ; } int main()
{
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(stact,,sizeof(stact));
tot=;cnt=;index=;
int n,m;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
int xx,y;
scanf("%d",&m);
for(int i = ;i <= m;i ++)
{
scanf("%d%d",&xx,&y);
add(xx,y);
}
for(int i = ; i <= n;i ++)
if(!dfn[i])
Tarjan(i);
cout<<sum<<" "<<flag;
return ;
}
Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)的更多相关文章
- Codeforces Round #244 (Div. 2)D (后缀自己主动机)
Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...
- codeforce 427 C. Checkposts(tarjan 强连通分量)
题目链接:http://codeforces.com/contest/427/problem/C 题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在juncti ...
- Codeforces Round #244 (Div. 2)——Checkposts
题目链接 题意: 给定n个点,每一个点有一个权值的有向图.如今须要选定一些点,使得这些点权值和最小.且满足:假设i能到达j且j能到达i,那么i.j能够仅仅选一个 分析: 强联通模板题 //使用时仅仅更 ...
- Codeforces Round #244 (Div. 2)
今天是水题集啊.... A. Police Recruits time limit per test 1 second memory limit per test 256 megabytes inpu ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq
B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer
题目是选出c个连续的囚犯,而且囚犯的级别不能大于t #include <iostream> using namespace std; int main(){ int n,t,c; cin ...
- Codeforces Round #244 (Div. 2) A. Police Recruits
题目的意思就是找出未能及时处理的犯罪数, #include <iostream> using namespace std; int main(){ int n; cin >> ...
- Codeforces Round #467 (div.2)
Codeforces Round #467 (div.2) 我才不会打这种比赛呢 (其实本来打算打的) 谁叫它推迟到了\(00:05\) 我爱睡觉 题解 A. Olympiad 翻译 给你若干人的成绩 ...
- Codeforces Round #469 (Div. 2)
Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. #include<bits/stdc++.h> #de ...
随机推荐
- es6 复制对象
var pp = {'name': '1','work': 'teacher'} var kk = [1,2] var tt = [] for(let index = 0; index<kk.l ...
- Jmeter对SQL Server进行压力测试
下载地址 https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/ 选择binary版本即可 下载的是apache-jmeter-5. ...
- Jmeter接口测试+压力测试+环境配置+证书导出
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...
- MySQL更新命令_UPDATE
创建测试表 mysql> CREATE TABLE `product` ( -> `proID` ) NOT NULL AUTO_INCREMENT COMMENT '商品表主键', -& ...
- SSM项目思路整合NEW
#首先进行项目思路整体分析,具体包括哪些模块,如何实现等: 一)搭建环境 1.导包: (Spring核心包4个 + 面向切面的包4个 + SpringJDBC和事务的包各一个, SpringMVC两个 ...
- if __name__ == "__main__":
工欲善其事,必先利其器 # 环境:Python3.6 + win10 # 目录结构: D:\test\ # 目录 ├─ t1.py # 文件 └─ t2.py # 文件 让模块如脚本一样运行 在Pyt ...
- 【题解】Luogu P3931 SAC E#1 - 一道难题 Tree
原题传送门 题目几乎告诉你要用最大流 先进行搜索,将树的叶子节点都连到一个虚拟点T上,流量为inf(这样不会干扰到前面部分的最大流) 其他边按树的形态连边,以根节点为S,跑一变最大流即可求出答案 #i ...
- 剑指offer(39)平衡二叉树
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 题目分析 第一种方法: 正常思路,应该会获得节点的左子树和右子树的高度,然后比较高度差是否小于1. 可是这样有一个问题,就是节点重复遍历了,影 ...
- ios外派公司—提供ios程序员外派ios应用外包业务(北京动点 可签合同)
北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验: 2.熟练使用Xcode.Objective C编码技能: 3.熟悉iOS开发框 ...
- nodejs创建文件
var fs = require('fs'); fs.writeFile(path + "test.txt", "hello world!", function ...