首页 > 代码库 > HXY烧情侣(洛谷 2194)
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:
31 2 331 22 33 2
输出样例#1:
3 1
输入样例#2:
310 20 1041 21 33 12 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 100010using 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;}
HXY烧情侣(洛谷 2194)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。