题目描述

众所周知,\(HXY\)已经加入了\(FFF\)团。现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了。这里有\(n\)座电影院,\(n\)对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用。\(m\)条单向通道连接相邻的两对情侣所在电影院。然后\(HXY\)有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可。并且每对情侣只需烧一遍,电影院可以重复去。然后她想花尽可能少的费用烧掉所有的情侣。问最少需要多少费用,并且当费用最少时的方案数是多少?由于方案数可能过大,所以请输出方案数对\(1e9+7\)取模的结果。

(注:这里\(HXY\)每次可以从任何一个点开始走回路。就是说一个回路走完了,下一个开始位置可以任选。所以说不存在烧不了所有情侣的情况,即使图不连通,\(HXY\)自行选择顶点进行烧情侣行动。且走过的道路可以重复走。)

输入输出格式

输入格式:

第一行,一个整数\(n\)。

第二行,\(n\)个整数,表示\(n\)个情侣所在点的汽油费。

第三行,一个整数\(m\)。

接下来\(m\)行,每行两个整数\(x_i,y_i\),表示从点xi可以走到\(y_i\)。

输出格式:

一行,两个整数,第一个数是最少费用,第二个数是最少费用时的方案数对\(1e9+7\)取模

输入输出样例

输入样例#1:

3
1 2 3
3
1 2
2 3
3 2

输出样例#1:

3 1

输入样例#2:

3
10 20 10
4
1 2
1 3
3 1
2 1

输出样例#2:

10 2

说明

数据范围:

对于\(30\%\)的数据,\(1<=n,m<=20\);

对于\(10\%\)的数据,保证不存在回路。

对于\(100\%\)的数据,\(1<=n<=100000,1<=m<=300000\)。所有输入数据保证不超过\(10^9\)。

思路:考虑tarjan缩点,把一个强连通分量缩成一个点的同时更新这个强连通分量里汽油费的最小值,最后每个强连通分量的最小值的和就是第一个子问题的答案,然后看看每个联通块中有多少个权值是它那个更新出来的最小值,根据乘法原理,把每个强连通分量得到结果乘起来就是第二个子问题的答案。

代码:

#include<cstdio>
#include<algorithm>
#include<cctype>
#include<stack>
#define maxn 100007
#define ll long long
using namespace std;
const ll mod=1e9+7;
int n,m,head[maxn],w[maxn],dfn[maxn],block[maxn],low[maxn],bel[maxn],cnt,js,num,ans;
bool vis[maxn];
ll zrj=1,size[maxn];
struct node{
int v,nxt;
}e[300007];
inline void ct(int u, int v) {
e[++num].v=v;
e[num].nxt=head[u];
head[u]=num;
}
stack<int>q;
void tarjan(int u) {
dfn[u]=low[u]=++cnt;
q.push(u),vis[u]=1;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
int x=-1;js++;
block[js]=w[u];
while(x!=u) {
x=q.top(),q.pop();
block[js]=min(block[js],w[x]);
bel[x]=js,vis[x]=0;
}
}
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&w[i]);
scanf("%d",&m);
for(int i=1,u,v;i<=m;++i) {
scanf("%d%d",&u,&v);
ct(u,v);
}
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
for(int i=1;i<=js;++i) ans+=block[i];
printf("%d ",ans);
for(int i=1;i<=n;++i) if(w[i]==block[bel[i]]) size[bel[i]]++;
for(int i=1;i<=js;++i) {
zrj*=size[i];
zrj%=mod;
}
printf("%d\n",zrj);
return 0;
}

洛谷P2194 HXY烧情侣的更多相关文章

  1. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  2. P2194 HXY烧情侣【Tarjan】

    前言 当时和\(GYZ\)大佬一起做这个题,他表示这个题对他很不友好(手动滑稽) 题目描述 众所周知,\(HXY\) 已经加入了 \(FFF\) 团.现在她要开始喜(sang)闻(xin)乐(bing ...

  3. 【luogu P2194 HXY烧情侣】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2194 第一问:缩点并且统计其强连通分量里的最小耗费.把所有强连通分量的最小耗费加起来. 第二问:统计在每个强 ...

  4. luogu P2194 HXY烧情侣

    残忍的题面 我们来看这一道题,其实冗长的题目告诉我们一个核心——用tarjan tarjan是用来干什么呢?是用来求强连通分量(代码中指sc) 求出来又有什么用呢?每当我们求出一个强连通分量时,就去计 ...

  5. HXY烧情侣(洛谷 2194)

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...

  6. HXY烧情侣

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...

  7. 洛谷P2194 【HXY烧情侣】

    首先请允许我吐槽一下这个题面 这个题面透露出血腥与暴力,电影院里还藏汽油 所以情侣们,要是想看电影就在家里看吧 毕竟出来容易被烧 在家里看虽然观影效果不如在电影院里 但是, 起码咱生命安全啥的有保障啊 ...

  8. 洛谷 P2195 HXY造公园 解题报告

    P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...

  9. 洛谷 P2195 HXY造公园

    P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...

随机推荐

  1. Could not find JSON in http://updates.jenkins-ci.org/update-center.json?id=default&version=2.7.4

    14-Sep-2016 21:43:58.241 INFO [Download metadata thread] hudson.model.AsyncPeriodicWork$1.run Finish ...

  2. VLAN虚拟局域网技术(三)-计算机网络

    本文主要知识来源于学校课程,部分知识来自于H3C公司教材,未经许可,禁止转载.如需转载,请联系作者并注明出处. 本节主要介绍 pVLAN和 动态VLAN. 1.   pVLAN:英文全称Private ...

  3. zero to one (3)

    工具使用 AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞. 功能及特 ...

  4. java面试题09

    A卷 1.选择题 public class Test01 { public static void changeStr(String str) { str = "welcome"; ...

  5. eclipse 通过maven 开发storm项目

    window系统安装java 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/ind ...

  6. BZOJ_1119_[POI2009]SLO_置换+贪心

    BZOJ_1119_[POI2009]SLO_置换+贪心 Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若 ...

  7. poj1191棋盘分割——区间DP

    题目:http://poj.org/problem?id=1191 分析题意,可知每次要沿棋盘中的一条线把一块一分为二,取其中一块继续分割: σ最小经分析可知即为每块的xi和的平方最小: 故用区间DP ...

  8. Windows平台Python编程必会模块之pywin32

    在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了. 不过,python模块虽多,也不可能满足开发者的所有需 ...

  9. Python3中内置类型bytes和str用法及byte和string之间各种编码转换,python--列表,元组,字符串互相转换

    Python3中内置类型bytes和str用法及byte和string之间各种编码转换 python--列表,元组,字符串互相转换 列表,元组和字符串python中有三个内建函数:,他们之间的互相转换 ...

  10. c# link 学习网站

    http://www.cnblogs.com/shanyou/p/4353433.html