80分不是wa最后两个点求助
查看原帖
80分不是wa最后两个点求助
227728
冰糖鸽子「僕は…」楼主2020/11/25 11:48

RT,80,WA的3和9,Kosaraju算法


// Problem: P2194 HXY烧情侣
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2194
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define M 1000005
const int p = 1e9+7;
int n,m,val[M],vis[M],ans,zz,bh[M],fromp[M],flag[M],minn,mcnt,cnt,u,v;
long long ans2=1;
vector<int>road[M];
vector<int>road2[M];
vector<int>newp[M];
vector<int>roadn[M];
void dfs_A(int x)
{
	if(vis[x]){return;}
	vis[x]=1;
	for(int i=0;i<road[x].size();i++)
	{
		dfs_A(road[x][i]);
	}
	cnt++;
	bh[cnt]=x;
}
void dfs_B(int x)
{
	if(vis[x]){return;}
	vis[x]=1;
	newp[cnt].push_back(x);
	if(val[x]<=minn)
	{
		if(val[x]==minn)
		{
			mcnt++;
		}
		else
		{
			minn=val[x];
			mcnt=1;
		}
	}
	fromp[x]=cnt;
	for(int i=0;i<road2[x].size();i++)
	{
		dfs_B(road2[x][i]);
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>val[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		road[u].push_back(v);
		road2[v].push_back(u);
	}
	dfs_A(1);
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==0)
		{
			ans+=val[i];
		}
		vis[i]=(vis[i]^1);
	}
	zz=cnt;
	while(zz>0)
	{
		minn=2000000000;mcnt=0;
		dfs_B(bh[zz]);
		ans+=minn;ans2*=(mcnt%p);ans2%=p;
		while(zz>0&&vis[bh[zz]])
		{
			zz--;
		}
	}
	cout<<ans<<' '<<ans2;
	return 0;
}
2020/11/25 11:48
加载中...