5RE
查看原帖
5RE
672044
Graph_Theory楼主2023/9/23 13:17
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005,mod=1000000007;
int n,m;
vector<int> e[maxn];
int cost[maxn],vis[maxn],mins[maxn],cnts[maxn];

int dfn[maxn],low[maxn],st[maxn],scc[maxn],ins[maxn];
int num,cnt,top;
void tarjan(int u)
{
	dfn[u]=low[u]=++num;
	st[++top]=u;
	ins[u]=1;
	for(int i=0;i<=e[u].size()-1;i++)
	{
		int v=e[u][i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(ins[v])
			low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		cnt++;
		int v;
		do{
			v=st[top--];
			ins[v]=0;
			scc[v]=cnt;
		}while(u!=v&&top>=0);
	}
}
int main()
{
	int u,v;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&cost[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&u,&v);
		e[u].push_back(v);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) tarjan(i);
	}
	memset(mins,0x3f,sizeof(mins));
	for(int i=1;i<=n;i++)
	{
		if(cost[i]<mins[scc[i]])
		{
			mins[scc[i]]=cost[i];
			cnts[scc[i]]=1;
		}
		else if(mins[scc[i]]==cost[i])
		{
			cnts[scc[i]]++;
		}
	}
	long long ans=0,amount=1;
	for(int i=1;i<=cnt;i++)
	{
		ans+=mins[i];
		amount=amount*cnts[i]%mod;
	}
	printf("%lld %lld\n",ans,amount);
	return 0;
}
2023/9/23 13:17
加载中...