求问昨天div2 E
  • 板块学术版
  • 楼主GODTREE
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/8/29 09:34
  • 上次更新2025/8/29 15:44:29
查看原帖
求问昨天div2 E
776799
GODTREE楼主2025/8/29 09:34

我觉得就是在一个环上的权值必须都相等才可以

然后写tarjan(或许是吧)挂了 求大佬调教

#include <bits/stdc++.h>
using namespace std;
int T;
const int N=2e5+5,M=4e5+5;
namespace solve
{
	int n,h[N],a[N],cnt,num[N],low[N],dfn,m,V,ans=1;
	struct edge
	{
		int from,to,nxt;
	}g[M];
	void add(int u,int v)
	{
		g[++cnt].from=u;
		g[cnt].to=v;
		g[cnt].nxt=h[u];
		h[u]=cnt;
	}
	void dfs1(int u,int fa)
	{
		low[u]=num[u]=++dfn;
		for (int i=h[u];~i;i=g[i].nxt)
		{
			int v=g[u].to;
			if (!num[v])
			{
				dfs1(v,u);
				low[u]=min(low[v],low[u]);
			}
			else if(num[v]<num[u]&&v!=fa)
			{
				low[u]=min(low[u],num[v]);
			}
		}
	}
	int main()
	{
		scanf("%d%d%d",&n,&m,&V);
		for (int i=1;i<=n;i++)
		{
			h[i]=-1;
		}
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		for (int i=1;i<=m;i++)
		{
			int u,v;
			cin>>u>>v;
			add(u,v);
		}
		dfs1(1,0);
		for (int i=1;i<=n;i++)
		{
			if (low[i]==num[i]&&a[i]!=-1)
			{
				ans*=V;
				ans%=998244353;
			}
			else if(a[i]!=-1&&a[low[i]]!=-1)
			{
				if (a[low[i]]!=a[i])
				ans*=0;
				else
				a[i]=a[low[i]];
			}
		}
		printf("%d\n",ans);
		return 0;
	}
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		solve::main();
	}
	return 0;
}
2025/8/29 09:34
加载中...