想用刚学的Kosaraju算法来用这道题试试手,结果怎么都找不到为什么错了,手测很多数据,Kosaraju算法求强联通部分应该没问题;看了记录里很多人挂成80都是取模问题,我取模改了很多次仍然过不了。没办法了,只能请求大佬们帮忙看一下了,感激不尽
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
long long x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
const long long mod=1e9+7;
int n,m,uu,vv;
int head[100005],tot,hd[100005],tt;
int dfn[100005],now;
int co[100005],col;
bool vis[100005];
long long ans1,ans2,minn[100005],cnt[100005],w[100005];
struct node
{
int next,to;
} e[300005],ex[300005];
void add(int x,int y)
{
e[++tot].next=head[x];
head[x]=tot;
e[tot].to=y;
//建反向边
ex[++tt].next=hd[y];
hd[y]=tt;
ex[tt].to=x;
}
void dfs(int u)
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(!vis[v])
{
vis[v]=1;
dfs(v);
}
}
dfn[++now]=u; //记后缀dfs序
}
void dfsx(int u)
{
for(int i=hd[u];i;i=ex[i].next){
int v=ex[i].to;
if(!vis[v])
{
co[v]=col;
vis[v]=1;
if(w[v]<minn[col])
{
minn[col]=w[v];
cnt[col]=1;
}
else if(w[v]==minn[col])
{
cnt[col]++;
}
dfsx(v);
}
}
minn[col]%=mod;
cnt[col]%=mod;
}
int main()
{
n=read();
for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
m=read();
for(int i=1;i<=m;i++)
{
uu=read();
vv=read();
add(uu,vv);
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(i);
}
}
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=now;i>=1;i--)
{
if(!vis[dfn[i]])
{
co[dfn[i]]=++col;
cnt[col]=1;
minn[col]=w[dfn[i]];
vis[dfn[i]]=1;
dfsx(dfn[i]);
}
}
ans2=1;
ans1=0;
for(int i=1;i<=col;i++)
{
ans1=(ans1+minn[i])%mod;
ans2=(cnt[i]*ans2)%mod;
}
printf("%lld %lld\n",ans1,ans2);
return 0;
}