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\n");
68         else
69            printf("Yes\n");
70       }
71       return 0;
72 }

 

posted @ 2020-02-09 00:16  一斜星辰酱  阅读(231)  评论(0编辑  收藏  举报