洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
2017-12-17 12:55
176 查看
洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
题目描述:
众所周知,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 3
3
1 2
2 3
3 2
输出样例#1:
3 1输入样例#2:
310 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缩点裸题不会tarjan的小伙伴可以参考我的另一篇博客
图论算法-Tarjan模板 【缩点;割顶;双连通分量】
tarjan缩点后每个强连通分量中最小的点权相加即为所求最小值
方案数可运用乘法原理
记录每个缩点中有几个最小的点权
在相乘时取膜即可
献上蒟蒻代码
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<stack> using namespace std; int n,m; int w[1000010]; vector<int> map[100010]; int dfn[100010],low[100010]; int col[100010]; int tot,colnum; stack<int> st; bool ins[100010]; int minn[100010];//记录每个强连通分量中的最小点权 int num[100010];//记录每个强连通分量有几个最小点权 int ans;//最小花费 int sum=1;//方案数 void tarjan(int u) { low[u]=dfn[u]=++tot; st.push(u); ins[u]=true; for(int j=0;j<map[u].size();j++) { int v=map[u][j]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(ins[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { colnum++; int temp; do { temp=st.top(); st.pop(); ins[temp]=false; col[temp]=colnum; if(w[temp]<minn[colnum]) { //更新最小值及最小值个数 minn[colnum]=w[temp]; num[colnum]=1; } else if(w[temp]==minn[colnum]) num[colnum]++;//更新最小点权数 } while(temp!=u); } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>w[i]; cin>>m; for(int i=1;i<=m;i++) { int s,t; cin>>s>>t; map[s].push_back(t); } memset(minn,127,sizeof(minn)); for(int i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } for(int i=1;i<=colnum;i++) { ans+=minn[i]; sum*=num[i]%1000000007; } cout<<ans<<" "<<sum; return 0; }
相关文章推荐
- 【洛谷P2194】 HXY烧情侣 强连通分量+tarjan+统计个数
- 洛谷P2194 HXY烧情侣
- 洛谷【P2194】HXY烧情侣
- 洛谷1262 间谍网络 tarjan缩点
- 【日常学习】【强连通分量tarjan缩点】codevs1611 抢掠计划题解
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
- Tarjan缩点+LCA【洛谷P2416】 泡芙
- 洛谷P1854 花店橱窗布置 分析+题解代码
- [LUOGU] P2194 HXY烧情侣
- NOI2001 食物链 题目分析&题解&代码
- 洛谷P1783 海滩防御 分析+题解代码
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
- HXY烧情侣(洛谷 2194)
- 洛谷P2341 受欢迎的牛——Tarjan+缩点模板
- 洛谷1262间谍网络(tarjan缩点)
- Tarjan 缩点模板(洛谷P3387)
- 洛谷p3387 拓扑+tarjan缩点
- 浅谈Tarjan缩点(分析+模板)
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
- tarjan缩点以及链式前向星的基本+应用(洛谷1262 间谍网络)