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 : 256MBScore : 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; }
相关文章推荐
- AtCoder Grand Contest 017 C - Snuke and Spells
- AtCoder Regular Contest 079
- AtCoder Regular Contest 066 E - Addition and Subtraction Hard
- AtCoder Regular Contest 079 F - Namori Grundy 乱搞
- AtCoder Regular Contest 078 D - Fennec VS. Snuke 树型DP/博弈
- AtCoder Regular Contest 078-D - Fennec VS. Snuke
- AtCoder Regular Contest 058 D - Iroha and a Grid 组合数学
- AtCoder Regular Contest 078 F - Mole and Abandoned Mine 状压dp
- AtCoder Regular Contest 079-D - Decrease (Contestant ver.)
- Atcoder AtCoder Regular Contest 079 E - Decrease (Judge ver.)
- AtCoder Regular Contest 081 F - Flip and Rectangles 动态规划
- AtCoder Regular Contest 079
- AtCoder Regular Contest 079 D - Decrease (Contestant ver.)
- AtCoder Regular Contest 066 E - Addition and Subtraction Hard 动态规划
- 【构造】AtCoder Regular Contest 079 D - Decrease (Contestant ver.)
- AtCoder Regular Contest 079 C D E
- 【贪心】AtCoder Regular Contest 079 E - Decrease (Judge ver.)
- 【构造】AtCoder Regular Contest 079 F - Namori Grundy
- AtCoder Regular Contest 079-E - Decrease (Judge ver.)
- 【AtCoder Regular Contest 082 F】Sandglass