• Cat Snuke and a Voyage AtCoder


    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<biN
    • (ai,bi)≠(1,N)
    • If ij(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只能转一次船也必须转一次船,所以需要有【1,c】,【c,n】两条船,所以只需要保存a=1的值和b=n的值。

    上代码:

    #include<iostream>
    #include<cmath>
    #include <algorithm>
    using namespace std;
    int main()
    {
    	int arr[200000];
    	int brr[200000];
    	int n,m;
    	cin>>n>>m;
    	int p=0,q=0;
    	for(int i=0;i<m;i++)
    	{
    		int a,b;
    		cin>>a>>b;
    		if(a==1)
    		{
    			arr[p++]=b;
    		}
    		if(b==n)
    		{
    			brr[q++]=a;
    		}
    	}
    	if(p==0||q==0)
    	{
    		cout<<"IMPOSSIBLE";
    	}
    	else
    	{
    		sort(arr,arr+p);
    		sort(brr,brr+q);
    		int i,j=1;
    		for(i=0;i<p;i++)
    		{
    			j--;
    			for(j;j<q;j++)
    			{
    				if(arr[i]==brr[j])
    				{
    					break;
    				}
    				if(arr[i]<brr[j])
    					break;
    			}
    			if(arr[i]==brr[j])
    			break;
    		}
    		if(arr[i]==brr[j]&&i!=p)
    			cout<<"POSSIBLE";
    		else
    			cout<<"IMPOSSIBLE";
    	}
     } 
    

      

  • 相关阅读:
    ASP.NET 2.0的页面缓存功能介绍
    第五课 主定理
    HDU 1051 Wooden Sticks
    一行代码让浏览器变编辑器
    算法概论习题1001Forest
    第七课 寻找强连通分量
    8223. Tiling a Grid With Dominoes
    迷宫
    第八课 最小生成树之Kruskal
    解决 Ubuntu 12.04 无法调节屏幕亮度的问题
  • 原文地址:https://www.cnblogs.com/mozheaishang/p/10017334.html
Copyright © 2020-2023  润新知