HXY烧情侣

题目描述

众所周知,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。

#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
using namespace std;
const int maxn=5e5+5;
const int mod=1e9+7;
template <class T>
inline void rd(T &ret){
    char c;
    ret = 0;
    while ((c = getchar()) < ‘0‘ || c > ‘9‘);
    while (c >= ‘0‘ && c <= ‘9‘){
        ret = ret * 10 + (c - ‘0‘), c = getchar();
    }
}
struct node{int to,nx;}p[maxn];
int vis[maxn],val[maxn],head[maxn],n,m,tot,cnt,ans,fn,dfn[maxn],low[maxn],my;
void addedge(int u,int v){
     p[++tot].to=v,p[tot].nx=head[u],head[u]=tot;
}
vector<int>v[maxn];
stack<int>sk;
void tarjan(int s){
      dfn[s]=low[s]=++cnt;
      vis[s]=1;
      sk.push(s);
      for(int i=head[s];i;i=p[i].nx){
            int to=p[i].to;
            if(!dfn[to]){
                tarjan(to);
                low[s]=min(low[s],low[to]);
            }
            else if(vis[to]) low[s]=min(low[s],dfn[to]);
      }
      if(dfn[s]==low[s]){
           int cur;
           ++my;
           do{
               cur=sk.top();
               sk.pop();
               vis[cur]=0;
               v[my].push_back(cur);
           }while(cur!=s);
      }
}
int main()
{
    rd(n);
    fn=1;
    REP(i,1,n)rd(val[i]);
    rd(m);
    REP(i,1,m){
        int u,v;
        rd(u),rd(v);
        addedge(u,v);
    }
    REP(i,1,n){
       if(!dfn[i])tarjan(i);
    }
    REP(i,1,my){
        int cur=v[i].size(),tmp=0,minn=mod;
        for(int j=0;j<cur;j++){
            if(minn>val[v[i][j]]){
                minn=val[v[i][j]];
                tmp=1;
            }
            else if(minn==val[v[i][j]]) tmp++;
        }
        ans+=minn;
        fn=(fn%mod*tmp%mod)%mod;
    }
    cout<<ans<<‘ ‘<<fn<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/czy-power/p/10447715.html

时间: 2024-07-31 18:11:58

HXY烧情侣的相关文章

洛谷 P2194 HXY烧情侣

P2194 HXY烧情侣 裸tarjan 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define LL long long 9 #define maxn 1000000 10 #define

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

洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽

HXY烧情侣(洛谷 2194)

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

【luogu P2194 HXY烧情侣】 题解

题目链接:https://www.luogu.org/problemnew/show/P2194 第一问:缩点并且统计其强连通分量里的最小耗费.把所有强连通分量的最小耗费加起来. 第二问:统计在每个强连通分量里与最小耗费相同的点数.乘法原理统计所有强连通分量答案. #include <stack> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&g

有关强连通分量

定义 在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected components).——以上来自百度百科 如上图,强连通分量有{1,2,3,4},{5},{6}. Tarjan 算法 Tarjan算法基于有向图的深度优先遍历,能够在线性时间内求

第四关——图论:强连通分量

14:27:28 写一首十几岁听的情歌,可惜我没在那个时候遇见你,否则我努力活到百岁以后,就刚好爱你一整个世纪  ——<零几年听的情歌> 今天是待在学校的最后一天了,撒花,庆祝!!!那也祝自己十六岁生日快乐 最近肺炎传染有点严重,大家能点外卖点外卖,能躺床躺床,少出门,你肆无忌惮赖在家的机会来了!!! 好了,今天要讲的呢,是要待在家好好学习一下的强连通分量. 概念 连通分量:在无向图中,即为连通子图. 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到v

xjtu暑期集训2016-7-9 题解

A 郭铮鹏与国际象棋 B 郭铮鹏与食堂买饭 C 郭铮鹏与烧情侣 D 郭铮鹏与线性代数 E 郭铮鹏与老司机 F GZP and Public Display of Affection G GZP Bureaucracy and Girlfriend H GZP and Dating A. 郭铮鹏与国际象棋 Description 郭铮鹏正在学习国际象棋.他已经学会了王.车和象的移动方式.国际象棋规则如下:棋盘由8行8列共64个格子组成,一个格子的位置通过数对(r,c)来表示,其中r表示行数c表示列

LG4931 情侣?给我烧了!

情侣?给我烧了! 有 \(n\) 对情侣来到电影院观看电影.在电影院,恰好留有 \(n\) 排座位,每排包含 \(2\) 个座位,共 \(2×n\) 个座位. 现在,每个人将会随机坐在某一个位置上,且恰好将这 \(2 × n\) 个座位坐满. 如果一对情侣坐在了同一排的座位上,那么我们称这对情侣是和睦的. 你的任务是求出当 \(k = 0, 1, ... , n\) 时,共有多少种不同的就坐方案满足恰好有 \(k\) 对情侣是和睦的. 两种就坐方案不同当且仅当存在一个人在两种方案中坐在了不同的位

[Luogu4921]情侣?给我烧了![错位排列]

题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k}\times A_n^k\times 2^k\times g(n-k) \] 考虑如何求 \(g(x)\) (一个错位排列). 考虑第一排,一共有三种情况:两男两女或者一男一女(不配对). 两男:顺次选出两男的方案数为 \(x(x-1)\) ,然后考虑他们的配偶在之后的配对情况: 如果强制不配对,