RT,80,WA的3和9,Kosaraju算法
// Problem: P2194 HXY烧情侣
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2194
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#include <bits/stdc++.h>
using namespace std;
#define M 1000005
const int p = 1e9+7;
int n,m,val[M],vis[M],ans,zz,bh[M],fromp[M],flag[M],minn,mcnt,cnt,u,v;
long long ans2=1;
vector<int>road[M];
vector<int>road2[M];
vector<int>newp[M];
vector<int>roadn[M];
void dfs_A(int x)
{
if(vis[x]){return;}
vis[x]=1;
for(int i=0;i<road[x].size();i++)
{
dfs_A(road[x][i]);
}
cnt++;
bh[cnt]=x;
}
void dfs_B(int x)
{
if(vis[x]){return;}
vis[x]=1;
newp[cnt].push_back(x);
if(val[x]<=minn)
{
if(val[x]==minn)
{
mcnt++;
}
else
{
minn=val[x];
mcnt=1;
}
}
fromp[x]=cnt;
for(int i=0;i<road2[x].size();i++)
{
dfs_B(road2[x][i]);
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>val[i];
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
road[u].push_back(v);
road2[v].push_back(u);
}
dfs_A(1);
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
ans+=val[i];
}
vis[i]=(vis[i]^1);
}
zz=cnt;
while(zz>0)
{
minn=2000000000;mcnt=0;
dfs_B(bh[zz]);
ans+=minn;ans2*=(mcnt%p);ans2%=p;
while(zz>0&&vis[bh[zz]])
{
zz--;
}
}
cout<<ans<<' '<<ans2;
return 0;
}