关于本题边双+搜索做法的求助
查看原帖
关于本题边双+搜索做法的求助
421421
Rem_CandleFire楼主2023/7/18 07:14

WA on #22 ,悬关1

#include<bits/stdc++.h>
#define R register
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[size],e2[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; vis[u]=1;
	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 if(vis[v])low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		++cnt;int v;
		do{
			v=sta[top--];bel[v]=cnt;
			vis[v]=0;
		}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 07:14
加载中...