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]&¬(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&¬(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";
}