洛谷P2194HXY燒情侶

2022-04-05 22:08:51 字數 1694 閱讀 2664

傳送門啦

這個題可以說是tarjan強連通分量的裸題,但需要維護每個強連通分量的最小值,所以做法就很明確了。

我們先明確幾個陣列的意思:

1.首先是tarjan縮點中的幾個陣列:

dfn[i]:i點的時間戳

low[i],表示這個點以及其子孫節點連的所有點中dfn最小的值

stack,表示當前所有可能能構成是強連通分量的點。

ins[i],表示 i 是否在stack[ ]陣列中

num[i],表示第 i 個強連通分量中有多少個點

belong[i],表示第 i 點在哪乙個強連通分量裡

2.然後是我們用來維護最小值以及最小 值個數的陣列

minn[i],表示第 i 個強連通分量中點權的最小值

sum:表示最小值是 i 的有多少個

最最最需要注意的兩初始化:

1.ans2 需要初始化為 1

2.minn[i]這個陣列要初始為正無窮。

#include #include #include #include using namespace std;

const long long mod = 1e9 + 7;

const int maxn = 1e5 + 5;

const int maxm = 3e5 + 4;

int n,m,a[maxn],x,y;

struct edgeedge[maxm << 1];

int head[maxn],tot;

int dfn[maxn],low[maxn],ind;

int stack[maxn],top,cnt,num[maxn],belong[maxn];

bool ins[maxn];

int ans1,ans2 = 1,minn[maxn],sum[maxn];

void add(int u,int v)

inline int read()

while(ch <= '9' && ch >= '0')

return x * f;

}void print(int x)

if(x > 9) print(x / 10);

putchar(x % 10 + '0');

}void tarjan(int x)

} int k;

if(dfn[x] == low[x]) while(k != x); }}

int main()

m = read();

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

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

minn[i] = 1e9;

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

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

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

print(ans1);

cout<<" ";

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

if(a[i] == minn[belong[i]])

sum[belong[i]]++;

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

ans2 = ans2 * sum[i] % mod;

print(ans2);

return 0;

}

洛谷 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有個絕技,如果她能從乙個點開始燒,最...

洛谷 P2193 HXY和序列

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