zoukankan      html  css  js  c++  java
  • Airline Routes

    Given a map of airline routes, you are supposed to check if a round trip can be planned between any pair of cities.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives two positive integers N (2) and M (≤), which are the total number of cities (hence the cities are numbered from 1 to N) and the number of airline routes, respectively. Then M lines follow, each gives the information of a route in the format of the source city index first, and then the destination city index, separated by a space. It is guaranteed that the source is never the same as the destination.

    After the map information, another positive integer K is given, which is the number of queries. Then K lines of queries follow, each contains a pair of distinct cities' indices.

    Output Specification:

    For each query, output in a line Yes if a round trip is possible, or No if not.

    Sample Input:

    12 19
    3 4
    1 3
    12 11
    5 9
    6 2
    3 2
    10 7
    9 1
    7 12
    2 4
    9 5
    2 6
    12 4
    11 10
    4 8
    8 12
    11 8
    12 7
    1 5
    20
    11 4
    12 7
    3 6
    2 3
    5 3
    3 9
    4 3
    8 3
    8 10
    10 11
    7 8
    7 1
    9 5
    1 9
    2 6
    3 1
    3 12
    7 3
    6 9
    6 8
    
     

    Sample Output:

    Yes
    Yes
    No
    No
    No
    No
    No
    No
    Yes
    Yes
    Yes
    No
    Yes
    Yes
    Yes
    No
    No
    No
    No
    No
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 vector<int> vc;
     5 vector<set<int> > vd;
     6 vector<pair<int,int> > v;
     7 pair<int,int> p;
     8 stack<int> s;
     9 int ddfs,color;
    10 
    11 void tarjan(int x)
    12 {
    13     set<int>::iterator its;
    14     v[x].first=-(++ddfs);
    15     v[x].second=ddfs;
    16     s.push(x);
    17     for(its=vd[x].begin();its!=vd[x].end();++its)
    18     {
    19         if(!v[*its].first)
    20         {
    21             tarjan(*its);
    22             v[x].second=min(v[*its].second,v[x].second);
    23         }
    24         else if(v[*its].first<0)
    25         v[x].second=min(v[x].second,-v[*its].first);
    26     }
    27     if(v[x].first+v[x].second==0)
    28     {
    29         v[x].first=-v[x].first;
    30         vc[x]=++color;
    31         for(;s.top()!=x;s.pop())
    32         {
    33             vc[s.top()]=color;
    34             v[s.top()].first=-v[s.top()].first;
    35         }
    36         s.pop();
    37     }
    38 }
    39 int main()
    40 {
    41 //  ios::sync_with_stdio(false);
    42 //  freopen("data.txt","r",stdin);
    43     int n,k,x,c1,c2;
    44     scanf("%d %d",&n,&k);
    45     v.resize(n,pair<int,int>(0,0));
    46     vd.resize(n);
    47     vc.resize(n);
    48       for(;k--;)
    49       {
    50         scanf("%d %d",&c1,&c2);
    51         c1--,c2--;
    52         vd[c1].insert(c2);
    53       }
    54       ddfs=0;
    55       color=0;
    56       for(int i=0;i<v.size();i++)
    57       {
    58           if(!v[i].first)
    59           tarjan(i);
    60     }
    61       scanf("%d",&k);
    62       for(;k--;)
    63       {
    64         scanf("%d %d",&c1,&c2);
    65         c1--,c2--;
    66         if(vc[c1]-vc[c2])
    67          printf("No
    ");
    68         else
    69            printf("Yes
    ");
    70       }
    71       return 0;
    72 }
    诚者,君子之所守也。
  • 相关阅读:
    Android CTS(frome google)
    Android CTS
    【Linux】- 修改系统时间与时区
    【Linux】- CentOS查看IP
    【Linux】- Ubutnu UFW防火墙的简单设置
    【Linux】- Ubuntu安装nginx
    【Linux】- apt-get命令
    【Linux】- Ubuntu搭建FTP服务器
    【Linux】- Ubuntu 配置mysql远程访问
    【Linux】- Ubuntu安装redis,并开启远程访问
  • 原文地址:https://www.cnblogs.com/SkystarX/p/12285807.html
Copyright © 2011-2022 走看看