WA#2 第156组数据 求hack
  • 板块CF1810E Monsters
  • 楼主sgz566
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/6 19:54
  • 上次更新2023/11/6 21:26:10
查看原帖
WA#2 第156组数据 求hack
378741
sgz566楼主2023/11/6 19:54

自测没找着错,求hack

主要思路:vector存边,dfs每个起点(所有的ai=0a_i=0)遇到没去过的点打怪数++,如果遇到去过的点计数器cnt++,如果连续走了n+1n+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;
}

2023/11/6 19:54
加载中...