Cat Snuke and a Voyage(AtCoder-2660)

it2022-05-05  182

Problem Description

In Takahashi Kingdom, there is an archipelago of N islands, called Takahashi Islands. For convenience, we will call them Island 1, Island 2, ..., Island N.

There are M kinds of regular boat services between these islands. Each service connects two islands. The i-th service connects Island ai and Island bi.

Cat Snuke is on Island 1 now, and wants to go to Island N. However, it turned out that there is no boat service from Island 1 to Island N, so he wants to know whether it is possible to go to Island N by using two boat services.

Help him.

Constraints

3≤N≤200 0001≤M≤200 0001≤ai<bi≤N(ai,bi)≠(1,N)If i≠j, (ai,bi)≠(aj,bj).

Input

Input is given from Standard Input in the following format:

N M a1 b1 a2 b2 : aM bM

Output

If it is possible to go to Island N by using two boat services, print POSSIBLE; otherwise, print IMPOSSIBLE.

Example

Sample Input 1

3 2 1 2 2 3

Sample Output 1

POSSIBLE

Sample Input 2

4 3 1 2 2 3 3 4

Sample Output 2

IMPOSSIBLE You have to use three boat services to get to Island 4.

Sample Input 3

100000 1 1 99999

Sample Output 3

IMPOSSIBLE

Sample Input 4

5 5 1 3 4 5 2 3 2 4 1 4

Sample Output 4

POSSIBLE You can get to Island 5 by using two boat services: Island 1 -> Island 4 -> Island 5.

题意:n 个点 m 条边,只能移动两次,问能否从 1 号点到达 n 号点

思路:建图 dfs 即可

Source Program

#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long const int MOD = 1E9+7; const int N = 200000+5; const int dx[] = {-1,1,0,0,-1,-1,1,1}; const int dy[] = {0,0,-1,1,-1,1,-1,1}; using namespace std; struct Edge{ int to; int next; }edge[N]; int n,m; int tot,head[N]; void addEdge(int from,int to){ edge[++tot].to=to; edge[tot].next=head[from]; head[from]=tot; } bool dfs(int s,int step){ if(s==n&&step==2) return true; for(int i=head[s];i!=-1;i=edge[i].next){ int to=edge[i].to; if(dfs(to,step+1)) return true; } return false; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); addEdge(x,y); } bool flag=dfs(1,0); if(flag) printf("POSSIBLE\n"); else printf("IMPOSSIBLE\n"); return 0; }

最新回复(0)