Tarjan 20pts求调
查看原帖
Tarjan 20pts求调
477821
toolong114514楼主2023/12/5 17:06
#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=3e5+10;
struct node{
	int to,nxt,val;
}edge[N];
int head[N];
int cnt;
void add(int u,int v){
	edge[++cnt]={v,head[u]};
	head[u]=cnt;
}
stack<int> stk;
int dfn[N],low[N];
int qlt,qlcnt[N],qlmin[N];
int t;
bool vst[N];
int pv[N];
void dfs(int x){
	dfn[x]=++t;
	low[x]=dfn[x];
	stk.push(x);
	vst[x]=true;
	for(int i=head[x];i!=-1;i=edge[i].nxt){
		if(!dfn[edge[i].to]){
			dfs(edge[i].to);
			low[x]=min(low[x],low[edge[i].to]);
		}else if(vst[x]){
			low[x]=min(low[x],dfn[edge[i].to]);
		}
	}
	if(low[x]==dfn[x]){
		qlt++;
		while(stk.top()!=x){
			int tmp=stk.top();
			stk.pop();
			if(qlmin[qlt]==pv[tmp]) qlcnt[qlt]++;
			if(qlmin[qlt]>pv[tmp]){
				qlcnt[qlt]=1;
				qlmin[qlt]=pv[tmp];
			}
			vst[tmp]=false;
		}
		if(qlmin[qlt]==pv[x]) qlcnt[qlt]++;
		if(qlmin[qlt]>pv[x]){
			qlcnt[qlt]=1;
			qlmin[qlt]=pv[x];
		}
		vst[x]=false;
		stk.pop();
	}
}
int n,m,ans1=1,ans2=0;
signed main(){
	//ios::sync_with_stdio(false);
	memset(head,-1,sizeof(head));
	memset(qlmin,0x7f,sizeof(qlmin));
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>pv[i];
	}
	cin>>m;
	while(m--){
		int x,y;
		cin>>x>>y;
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) dfs(i);
	}
	for(int i=1;i<=qlt;i++){
		ans2+=qlmin[i];
		ans1*=qlcnt[i];
		ans1%=mod;
	}
	cout<<ans2<<" "<<ans1;
	return 0;
}
2023/12/5 17:06
加载中...