题目链接:https://atcoder.jp/contests/arc079/tasks/arc079_a
题意:
给你n个点m条边;
问你是否存在一条从1到n的长度为2的边;
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
struct Edge
{
int to;
int next;
}a[400009];
int cnt;
int head[400009];
int n;
int vis[400009];
void addedg(int u,int v)
{
a[cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt++;
}
int flag=0;
void dfs(int s,int t)
{
if(t>2)return;
else if(t==2)
{ if(s==n)
{
flag=1;
}
return;
}
else
{
for(int e=head[s];e!=-1;e=a[e].next)
{
/*if(vis[e]==0)
{
vis[e]=1;
dfs(a[e].to,t+1);
vis[e]=0;
}*上面的写法用到了回溯,仔细想了一下不用回溯,两种写法都过了。
dfs(a[e].to,t+1);
}
}
}
int main()
{
int m;
cin>>n>>m;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
addedg(u,v);
addedg(v,u);
}
// vis[1]=0;
dfs(1,0);
if(flag==1)
{
cout<<"POSSIBLE";
}
else
{
cout<<"IMPOSSIBLE";
}
}
代码二:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
struct Edge
{
int to;
int next;
} a[400009];
int cnt;
int head[400009];
int n;
int vis[400009];
void addedg(int u,int v)
{
a[cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt++;
}
int flag=0;
int dfs(int s,int t)
{
if(t==2)
{
if(s==n)
{
return 1;
}
}
if(t<2)
{
for(int e=head[s]; e!=-1; e=a[e].next)
{
if(dfs(a[e].to,t+1))return 1;
}
}
return 0;
}
int main()
{
int m;
cin>>n>>m;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1; i<=m; i++)
{
int u,v;
cin>>u>>v;
addedg(u,v);
addedg(v,u);
}
// vis[1]=0;
if(dfs(1,0))
{
cout<<"POSSIBLE";
}
else
{
cout<<"IMPOSSIBLE";
}
}