#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;
}