88pts,玄关求条
查看原帖
88pts,玄关求条
934048
ni_ju_ge楼主2024/9/27 19:24

dfs做的,WA on#7 #16 #22 #24

#include<iostream>
using namespace std;
int g[1001][1001],d[1001][1001],n,m,x,y,b[1001],v[1001],kk[1001];
bool pk(int t,int s)
{
	if(kk[t]&&not(s>=3&&g[t][b[1]]>=1))return false;
	kk[t]=0;
	for(int i=1;i<s;i++)
	{
// 		cout<<t<<" "<<i<<" "<<b[i]<<" "<<g[t][b[i]]<<endl;
		if(g[t][b[i]]>=1&&not(i==1&&s>=3&&g[t][b[1]]>=1))
		{
			kk[t]=s;
			return false;
		}
	}
	return true;
}
void dfs(int k,int s,int q)
{
	b[s]=k;
	if(s>=4&&g[k][q]>=1)
	{
		y=1;
		for(int i=1;i<=s;i++)cout<<b[i]<<" ";
		exit(0);
	}
	if(s>=4&&k==q)
	{
		y=1;
		for(int i=1;i<=s;i++)cout<<b[i]<<" ";
		exit(0);
	}
	int bb;bb=0;
	for(int i=d[k][0];i>=1;i--)
	{
	    if(kk[d[k][i]]<=s&&kk[d[k][i]!=0])
	    {
	        kk[d[k][i]]=0;
	    }
// 		cout<<k<<endl;
        if(g[k][d[k][i]]==1)bb++;
		if(g[k][d[k][i]]==1&&v[d[k][i]]==0&&pk(d[k][i],s))
		{
			g[k][d[k][i]]=0;v[k]=1;
			dfs(d[k][i],s+1,q);
			g[k][d[k][i]]=1;v[k]=0;
			if(y==1)return;
		}
		if(bb==g[k][0])return;
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		d[x][++d[x][0]]=y;
		d[y][++d[y][0]]=x;
		g[x][y]=1;g[x][0]++;
		g[y][x]=1;g[y][0]++;
	}
	x=1;y=0;int xx=1;
	for(int i=1;i<=n;i++)
	{
	   if(y==1)break;
		dfs(i,1,i);
		for(int j=1;j<=n;j++)kk[j]=0;
	}
	if(y==0)cout<<"no";
}
2024/9/27 19:24
加载中...