自测没找着错,求hack
主要思路:vector存边,dfs每个起点(所有的ai=0)遇到没去过的点打怪数++,如果遇到去过的点计数器cnt++,如果连续走了n+1个走过的点,说明走进了一个环,退出dfs。
#include<bits/stdc++.h>
using namespace std;
int n,m,a[200005],father[200005];
vector<int> edge[200005];
bool flag[200005]={},ist=0,ist2=0;
void dfs(int x,int y,int cnt)
{
if(ist||cnt>n)return;
//cout<<x<<" "<<y<<" "<<cnt<<endl;
if(y==n||ist||cnt>n)
{
if(y==n)ist=1;
flag[x]=0;
return;
}
int len=edge[x].size();
for(int i=0;i<len;i++)
{
if(father[edge[x][i]]==x)continue;
if(a[edge[x][i]]<=y)
{
father[edge[x][i]]=father[x];
//cout<<"yee "<<edge[x][i]<<" "<<flag[edge[x][i]]<<endl;
if(!flag[edge[x][i]])
{
flag[edge[x][i]]=1;
dfs(edge[x][i],y+1,0);
flag[edge[x][i]]=0;
}
else dfs(edge[x][i],y,cnt+1);
}
}
return;
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=1;i<=n;i++)
{
edge[i].clear();
}
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
father[i]=i;
}
int x,y;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
edge[x].push_back(y);
edge[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
//cout<<i<<endl;
if(a[i]==0)
{
//cout<<i<<endl;
flag[i]=1;
dfs(i,1,0);
flag[i]=0;
if(ist)
{
//ist=0;
cout<<"YES"<<endl;
ist2=1;
break;
}
}
}
if(!ist2)cout<<"NO"<<endl;
ist=ist2=0;
}
return 0;
}