80分wa最后两个点求助
查看原帖
80分wa最后两个点求助
65942
一珂松果楼主2020/11/12 20:26

想用刚学的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;
}
2020/11/12 20:26
加载中...