HXY燒情侶(洛谷 2194)

2022-05-14 16:48:02 字數 1926 閱讀 1572

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

31 2

2 33 2

輸出樣例#1:

3 1
輸入樣例#2:

3

10 20 10

41 2

1 33 1

2 1

輸出樣例#2:

10 2
資料範圍:

對於30%的資料,1<=n,m<=20;

對於10%的資料,保證不存在迴路。

對於100%的資料,1<=n<=100000,1<=m<=300000。所有輸入資料保證不超過10^9。

/*

tarjan縮點之後,找出每個縮點中的最小花費,顯然在這裡點燃汽油花費最小 ,然後如果有花費相同的,就累計方案數,將每個縮點的方案數相乘就是最後 的方案數。

*/#include

#include

#include

#include

#include

#define inf 1000000000

#define mod 1000000007

#define m 100010

using

namespace

std;

intnum[m],low[m],instack[m],vis[m],mon[m],indexx,cnt,n,m;

vector

grap[m];

vector

tuan[m];

stack

s;intread()

while(c>='

0'&&c<='9')

return num*flag;

}void tarjan(int

v)

else

if(instack[w])

low[v]=min(low[v],num[w]);

}intu;

if(num[v]==low[v])

while(u!=v);

}}int

main()

for(int i=1;i<=n;i++)

if(!vis[i])tarjan(i);

int tot=1,ans=0

;

for(int i=1;i<=cnt;i++)

else

if(mon[x]==minn)

}ans+=minn;tot*=c;tot%=mod;

}printf(

"%d %d

",ans,tot);

return0;

}

view code

洛谷P2194HXY燒情侶

傳送門啦 這個題可以說是tarjan強連通分量的裸題,但需要維護每個強連通分量的最小值,所以做法就很明確了。我們先明確幾個陣列的意思 1.首先是tarjan縮點中的幾個陣列 dfn i i點的時間戳 low i 表示這個點以及其子孫節點連的所有點中dfn最小的值 stack,表示當前所有可能能構成是...

洛谷 P2194 HXY燒情侶 Tarjan縮點

題目描述 眾所周知,hxy已經加入了fff團。現在她要開始喜 sang 聞 xin 樂 bing 見 kuang 地燒情侶了。這裡有n座電影院,n對情侶分別在每座電影院裡,然後電影院裡都有汽油,但是要使用它需要一定的費用。m條單向通道連線相鄰的兩對情侶所在電影院。然後hxy有個絕技,如果她能從乙個點...

洛谷 P2193 HXY和序列

題目描述 hxy突發奇想,她想要找到乙個正整數序列,滿足序列中所有的數不超過n,序列長度為p,且除了第乙個數外,所有的數都能被前乙個數整除 即是前乙個數的倍數 很快她找到了乙個這樣的序列。可是她覺得還不夠,想要知道這樣的序列有多少個,可她被驚人的資料範圍嚇怕了。現在她找到了你,請你來幫助她解決這個問...