CF652E WA on #22 求助 悬关1
  • 板块灌水区
  • 楼主Rem_CandleFire
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/18 21:14
  • 上次更新2023/11/3 09:01:16
查看原帖
CF652E WA on #22 求助 悬关1
421421
Rem_CandleFire楼主2023/7/18 21:14

#22 的数据为:

n=300000 m=299999
1 2 0
2 3 0
3 4 0
...
(后面的内容像这样子持续到55 56 0,其余的看不到了)
#include<bits/stdc++.h>
#define R register
#define int long long
using namespace std;
const int size=3e5+5;
int n,m,x,y,z,tim,top,cnt,fr,to,ans,ed1,ed2;
int dfn[size],low[size],sta[size],sum[size],bel[size],vis[2*size],hd1[size],hd2[size];
struct edge{
	int to,flag,nxt,id;
}e[2*size],e2[2*size];
void add(int x,int y)
{
	e[++ed1]={y,z,hd1[x]};
	hd1[x]=ed1;
}
void add2(int x,int y,int z)
{
	e2[++ed2]={y,z,hd2[x]};
	hd2[x]=ed2;
}
void tarjan(int u,int fa)
{
	dfn[u]=low[u]=++tim;
	int flag=1; sta[++top]=u; 
	for(R int i=hd1[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa&&flag){ flag=0; continue;}
		if(!dfn[v])
		{
			tarjan(v,u);
			low[u]=min(low[v],low[u]);
		}
		else low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		++cnt;int v;
		do{
			v=sta[top--];bel[v]=cnt;
		}while(v!=u);
	}
}
void dfs(int p,int f,int fa)
{
	if(p==bel[to])
	{
		ans|=f;
		return ;
	}
	for(R int i=hd2[p];i;i=e2[i].nxt)
		if(!vis[i]&&e2[i].to!=fa)
			vis[i]=1,dfs(e2[i].to,f|e2[i].flag|sum[e2[i].to],p);
} 
signed main()
{
	scanf("%d%d",&n,&m);
	for(R int i=1;i<=m;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y);add(y,x);
	}
	for(R int i=1;i<=n;++i)
		if(!dfn[i])tarjan(i,0);
	scanf("%d%d",&fr,&to);
	for(R int i=1;i<=n;++i)
	{
		for(R int j=hd1[i];j;j=e[j].nxt)
		{
			int v=e[j].to,num=e[j].flag;
			if(bel[v]!=bel[i])
			{
				add2(bel[i],bel[v],num);
				add2(bel[v],bel[i],num);
			}
			else sum[bel[i]]|=num;
		}
	}
	if(bel[fr]!=bel[to])dfs(bel[fr],sum[bel[fr]],0);
	else ans=sum[bel[fr]];
	cout<<(ans?"YES":"NO");
	return 0;
}
2023/7/18 21:14
加载中...