zoukankan      html  css  js  c++  java
  • HXY烧情侣(洛谷 2194)

    题目描述

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

    /*
      tarjan缩点之后,找出每个缩点中的最小花费,显然在这里点燃汽油花费最小  ,然后如果有花费相同的,就累计方案数,将每个缩点的方案数相乘就是最后  的方案数。
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<stack>
    #define INF 1000000000
    #define mod 1000000007
    #define M 100010
    using namespace std;
    int num[M],low[M],instack[M],vis[M],mon[M],indexx,cnt,n,m;
    vector<int> grap[M];
    vector<int> tuan[M];
    stack<int> s;
    int read()
    {
        char c=getchar();int num=0,flag=1;
        while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
        while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
        return num*flag;
    }
    void tarjan(int v)
    {
        num[v]=low[v]=++indexx;
        vis[v]=instack[v]=1;
        s.push(v);
        for(int i=0;i<grap[v].size();i++)
        {
            int w=grap[v][i];
            if(!vis[w])
            {
                tarjan(w);
                low[v]=min(low[v],low[w]);
            }
            else if(instack[w])
              low[v]=min(low[v],num[w]);
        }
        int u;
        if(num[v]==low[v])
        {
            ++cnt;
            do
            {
                u=s.top();
                instack[u]=0;
                tuan[cnt].push_back(u);
                s.pop();
            }while(u!=v);
        }
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
          mon[i]=read();
        m=read();
        for(int i=1;i<=m;i++)
        {
            int x=read(),y=read();
            grap[x].push_back(y);
        }
        for(int i=1;i<=n;i++)
          if(!vis[i])tarjan(i);
        int tot=1,ans=0;
        for(int i=1;i<=cnt;i++)
        {
            int minn=INF,c=0;
            for(int j=0;j<tuan[i].size();j++)
            {
                  int x=tuan[i][j];
                  if(mon[x]<minn)
                  {
                      minn=mon[x];
                      c=1;
                }
                else if(mon[x]==minn)
                {
                    c++;c%=mod;
                }
            }
            ans+=minn;tot*=c;tot%=mod;
        }
        printf("%d %d",ans,tot);
        return 0;
    }
    View Code
  • 相关阅读:
    记录python爬取猫眼票房排行榜(带stonefont字体网页),保存到text文件,csv文件和MongoDB数据库中
    分析Ajax来爬取今日头条街拍美图并保存到MongDB
    把SQLAlchemy查询对象转换成字典/json使用(汇总)
    把SQLAlchemy查询对象转换成字典/json使用(分开)
    使用Flask_SQLAlchemy连接多个数据库
    SQLAlchemy小知识点
    flask_sqlalchemy和sqlalchemy联系区别及其使用方式
    使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片
    使用python脚本定时备份web网站
    使用shell脚本定时备份web网站代码
  • 原文地址:https://www.cnblogs.com/harden/p/5837994.html
Copyright © 2011-2022 走看看