题目描述

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

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

输入输出格式

输入格式:

第一行,一个整数n。

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

第三行,一个整数m。

接下来m行,每行两个整数xi,yi,表示从点xi可以走到yi。

输出格式:

一行,两个整数,第一个数是最少费用,第二个数是最少费用时的方案数对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。

闲话:

烧情侣???记得带我一个啊!

分析:

本题题面中的走回路告诉了我们这题的算法:缩点!至于答案我们可以开一个数组进行存储,最后统一求解。

CODE:

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int M=;
const int MOD=;
int n,m,tot,cnt,k;
int vis[M],low[M],maxn[M],dfn[M],to[M],head[M],nxt[M],v[M],connected[M],stack[M],ways[M];
void add(int u,int v){
nxt[++tot]=head[u];head[u]=tot;
to[tot]=v;return;
}
void tarjan(int x){
low[x]=dfn[x]=++tot;vis[x]=;stack[++stack[]]=x;
for (int i=head[x];i;i=nxt[i]){
if (!dfn[to[i]]){
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}
else if (vis[to[i]]) low[x]=min(low[x],dfn[to[i]]);
}
if (low[x]==dfn[x]){
maxn[++k]=;
while (stack[stack[]]!=x){
connected[stack[stack[]]]=k;vis[stack[stack[]]]=;
maxn[k]=min(maxn[k],v[stack[stack[]]]);
stack[]--;
}
connected[stack[stack[]]]=k;maxn[k]=min(maxn[k],v[stack[stack[]]]);
vis[stack[stack[]]]=;stack[]--;
}
return;
}
int fr(){
int ans=,f=;
char c=getchar();
while (c<''||c>''){if (c=='-') f=-;c=getchar();}
while (c>=''&&c<=''){ans=(ans<<)+(ans<<)+(c^);c=getchar();}
if (f) return ans;return -ans;
}
int main(){
n=fr();
for (int i=;i<=n;i++) v[i]=fr();
m=fr();
for (int i=;i<=m;i++){
int x=fr(),y=fr();
add(x,y);
}
long long ans=;
for (int i=;i<=n;i++) if (!dfn[i]) tarjan(i);
for (int i=;i<=k;i++) ans+=maxn[i];
cout<<ans<<" ";ans=;
for (int i=;i<=n;i++)
if (v[i]==maxn[connected[i]]) ways[connected[i]]++;
for (int i=;i<=k;i++) ans=ans*ways[i]%MOD;
cout<<ans;
return ;
}

HXY烧情侣的更多相关文章

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

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

  2. 洛谷P2194 HXY烧情侣

    题目描述 众所周知,\(HXY\)已经加入了\(FFF\)团.现在她要开始喜\((sang)\)闻\((xin)\)乐\((bing)\)见\((kuang)\)地烧情侣了.这里有\(n\)座电影院, ...

  3. HXY烧情侣(洛谷 2194)

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

  4. P2194 HXY烧情侣【Tarjan】

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

  5. 洛谷P2194 【HXY烧情侣】

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

  6. luogu P2194 HXY烧情侣

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

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

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

  8. 洛谷P2194HXY烧情侣

    传送门啦 这个题可以说是tarjan强连通分量的裸题,但需要维护每个强连通分量的最小值,所以做法就很明确了. 我们先明确几个数组的意思: 1.首先是tarjan缩点中的几个数组: dfn[i]:i点的 ...

  9. Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)

    Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...

随机推荐

  1. 深入了解line-height(各种单位总结1.5/150%/1.5em)

    默认状态,浏览器使用1.0-1.2 line-height, 这是一个初始值.你可以定义line-height属性来覆盖初始值:p{line-height:140%} 你可以有5种方式来定义line- ...

  2. Jmeter脚本如何在Linux通过no GUI的方式运行 命令行传递参数

    本文主要介绍Jmeter脚本如何在Linux通过no GUI的方式运行.总共分三部分: 1.Linux下JDK的安装及环境变量的配置 2.Linux下Jmeter的安装及环境变量的配置 3.运行结果的 ...

  3. tonight i need your body

    wdnmd wdnmd 再lable中我们有几个不同的type参数: text     写的是文本类型的参数 password    不管输入的是什么显示的都是星星 date    输入的是一个日历本 ...

  4. 认识和学习BASH alias 给长命令起别名 unalias 取消该别名

    此图反映了shell所在的位置与作用. 既然Shell与KDE和application等都是用户与Kernel的接口,那为什么还要学习呢?书中也给出了答案. 通用性,可以这样理解,也就是所谓的跨平台机 ...

  5. SharpZipLib 文件/文件夹 过滤

    这里就不说压缩/解压了.网上教程太多. 主要说一下,解压时,如何过滤某些文件/文件夹 参考地址:https://github.com/icsharpcode/SharpZipLib/wiki/Fast ...

  6. 36.两个链表的第一个公共结点(python)

    题目描述 输入两个链表,找出它们的第一个公共结点. class Solution: def FindFirstCommonNode(self, pHead1, pHead2): # write cod ...

  7. 【错误总结】Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    大致意思是因为模板里面应该包含一个根元素,使用组件的时候应该用div或p标签包起来

  8. 【JZOJ6435】【luoguP5666】【CSP-S2019】树的重心

    description analysis 需要知道一棵树的重心一定在从根出发的重链上,可以考虑先进行树链剖分弄出重儿子和次重儿子,再倍增维护重儿子 由于重链上有一个或两个重心,接下来求的重心都是深度较 ...

  9. Vue学习笔记【1】——什么是Vue.js

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于We ...

  10. Android 在OnCreate()中获取控件高度与宽度

    试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int ...