ps:有人趁我不在JC了我,修改了我的Tarjan代码
我可能没有挑全他改的地方从而炸了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int head[4666666],ed,sta[4664514],top,col;
struct edge{
int v,next;
}e[4652141];
void add(int u,int v)
{
ed++;
e[ed].v=v;
e[ed].next=head[u];
head[u]=ed;
}
int dfn[4666666],low[4666666],df,vis[4666666],vi[4666666],comoney[343356],money[343356],conb[1243356];
void dfs(int u)
{
top++;sta[top]=u;
df++;
dfn[u]=low[u]=df;vi[u]=1;
for(int j=head[u];j;j=e[j].next)
{
int v=e[j].v;
if(!dfn[v]) {
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(vi[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
col++;
vi[u]=0;
conb[col]=1;
comoney[col]=money[u];
while(sta[top]!=u)
{
if(comoney[col]==money[sta[top]])
{
conb[col]++;
}
if(comoney[col]>money[sta[top]])
{
conb[col]=1;
comoney[col]=money[sta[top]];
}
vi[sta[col]]=0,top--;
}
top--;
}
}
int i,j,u,v,n,p,r,x[2345456],y[1235445],ans,anc=1;
signed main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>money[i];
}
cin>>r;
for(i=1;i<=r;i++)
{
cin>>x[i]>>y[i];
add(x[i],y[i]);
}
for(i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(i=1;i<=col;i++)
{
ans=(ans+comoney[i]);anc=(anc*conb[i])%1000000007;
}
cout<<ans<<" "<<anc;
return 0;
}