题目: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 强连通分量)的更多相关文章

  1. Codeforces Round #244 (Div. 2)D (后缀自己主动机)

    Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...

  2. codeforce 427 C. Checkposts(tarjan 强连通分量)

    题目链接:http://codeforces.com/contest/427/problem/C 题目大意是有n个junctions,这些junctions之间有m条道路,两两相连,现在在juncti ...

  3. Codeforces Round #244 (Div. 2)——Checkposts

    题目链接 题意: 给定n个点,每一个点有一个权值的有向图.如今须要选定一些点,使得这些点权值和最小.且满足:假设i能到达j且j能到达i,那么i.j能够仅仅选一个 分析: 强联通模板题 //使用时仅仅更 ...

  4. Codeforces Round #244 (Div. 2)

    今天是水题集啊.... A. Police Recruits time limit per test 1 second memory limit per test 256 megabytes inpu ...

  5. 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 ...

  6. Codeforces Round #244 (Div. 2) B. Prison Transfer

    题目是选出c个连续的囚犯,而且囚犯的级别不能大于t #include <iostream> using namespace std; int main(){ int n,t,c; cin ...

  7. Codeforces Round #244 (Div. 2) A. Police Recruits

    题目的意思就是找出未能及时处理的犯罪数, #include <iostream> using namespace std; int main(){ int n; cin >> ...

  8. Codeforces Round #467 (div.2)

    Codeforces Round #467 (div.2) 我才不会打这种比赛呢 (其实本来打算打的) 谁叫它推迟到了\(00:05\) 我爱睡觉 题解 A. Olympiad 翻译 给你若干人的成绩 ...

  9. Codeforces Round #469 (Div. 2)

    Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. #include<bits/stdc++.h> #de ...

随机推荐

  1. hdu4777 树状数组

    题意:给了n个数,然后又m次查询,询问[L,R] 内有多少个数与其他的数不互质. 解: 我们首先可以通过处理得出每个数的有效区间,LR 就是 左边L位置上的数 和他不互质, 右边R位置上的数和不互质, ...

  2. 0005-20180422-自动化第六章-python基础学习笔记

    day6 内容回顾: 1. 变量 2. 条件 3. while循环 4. 数据类型 - int - bit_length - bool - True/False - str - upper - low ...

  3. 即时通讯(IV)

    数据流

  4. vscode格式化代码插件Beautify

    vscode格式化代码安装 VsCode 格式化代码插件搜索并安装 Beautify 格式化代码插件使用:打开要格式化的文件 —> F1 —> Beautify file —> 选择 ...

  5. Poj3984 迷宫问题 (BFS + 路径还原)

    Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...

  6. Shell read交互

    read语句:设定客户端交互的任意输出值. 参数: -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符. -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标 ...

  7. Spring IOC 注入方式详解 附代码

    引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...

  8. 剑指offer(16)合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...

  9. 获取Tomcat更详细的日志

    前言 有时候tomcat报错未详细,未能定位到原因. 解决方法: 获取更详细的日志,以便调试. 详细步骤:   获取详细的日志,方法如下: 在WEB-INF/classes目录下logging.pro ...

  10. Learning-Python【19】:Python常用模块(2)—— os、sys、shutil

    os模块:与操作系统相关的模块 import os # 获取当前的工作目录 print(os.getcwd()) # 切换工作目录 os.chdir(r'E:\Python\test') print( ...