60pts求助
  • 板块P2194 HXY烧情侣
  • 楼主int08
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/31 21:41
  • 上次更新2023/11/2 10:29:20
查看原帖
60pts求助
508032
int08楼主2023/10/31 21:41

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;
}
2023/10/31 21:41
加载中...