您的位置:首页 > 其它

AtCoder Regular Contest 079-C - Cat Snuke and a Voyage

2017-07-30 08:38 495 查看

C - Cat Snuke and a Voyage

Time limit : 2sec / Memory limit : 256MB

Score : 300 points

Problem Statement

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 000

1≤M≤200 000

1≤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.

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.

题目大意:给出一个有向图,问1->n能否两步到达。

解题思路:dfs搜索,或者判断1的下一个结点和n的上一个结点是否有公共的就行了。

#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL INF=1e18;
const int MAXN=2e5+5;
const double eps=1e-10;
int tot;
int head[MAXN];
int n,m;

struct Edge
{
int from,to,nxt;
}e[MAXN];

void addedge(int u,int v)
{
e[tot].from=u;
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot++;
}

bool dfs(int s,int t,int k)
{
if(s==n&&k==2) return true;
for(int i=head[s];i!=-1;i=e[i].nxt)
{
int to=e[i].to;
if(dfs(to,n,k+1)) return true;
}
return false;
}

int main()
{
int d,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-1,sizeof(head));
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
if(dfs(1,n,0))
printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}


#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL INF=1e18;
const int MAXN=2e5+100;
const double eps=1e-10;
bool vis[MAXN];

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int u,v;
bool flag=false;
for(int i=1;i<=n;i++)
vis[i]=false;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
if(flag) continue;
if(u==1)
{
if(vis[v])
{
flag=true;
}
vis[v]=true;
}else if(v==n)
{
if(vis[u])
{
flag=true;
}
vis[u]=true;
}
}
if(flag) printf("POSSIBLE\n");
else printf("IMPOSSIBLE\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: