• Source
    1. #include <iostream>
    2. #include <cstdio>
    3. #include <vector>
    4. #include <queue>
    5. using namespace std;
    6. const int N=100008;
    7. queue< pair< int, int > > q;
    8. pair<int,int> p1,p2;
    9. bool door[N];
    10. int key[N];
    11. bool mark[N];
    12. vector<int> graph[N];
    13. bool pushed[N];
    14. int main()
    15. {
    16. bool ans;
    17. bool added;
    18. int i,j,n,m,b,c,d,e,f,k,t;
    19. scanf("%d%d%d",&n,&k,&m);
    20. while(n!=-1 && k!=-1 && m!=-1)
    21. {
    22. while(!q.empty())
    23. q.pop();
    24. for(i=1;i<=n;i++)
    25. graph[i].clear();
    26. for(i=1;i<=n;i++)
    27. {
    28. key[i]=0;
    29. door[i]=false;
    30. mark[i]=false;
    31. }
    32. for(i=1;i<=k;i++)
    33. {
    34. scanf("%d%d",&c,&d);
    35. key[c]=d;
    36. door[d]=true;
    37. }
    38. for(i=1;i<=m;i++)
    39. {
    40. scanf("%d%d",&c,&d);
    41. graph[c].push_back(d);
    42. graph[d].push_back(c);
    43. }
    44. ans=false;
    45. q.push(make_pair(1,0));
    46. while(!q.empty())
    47. {
    48. b=q.front().first;
    49. if(pushed[b]==true)
    50. pushed[b]=false;
    51. c=q.front().second;
    52. if(c>2*m)
    53. break;
    54. if(b==n)
    55. {
    56. ans=true;
    57. break;
    58. }
    59. if(key[b]!=0)
    60. {
    61. door[key[b]]=false;
    62. }
    63. added=true;
    64. for(i=0;i<graph[b].size();i++)
    65. {
    66. d=graph[b][i];
    67. if(mark[d]==false)
    68. {
    69. if(door[d]==false)
    70. {
    71. mark[d]=true;
    72. q.push(make_pair(d,c+1));
    73. }
    74. else
    75. added=false;
    76. }
    77. }
    78. q.pop();
    79. if(added==false && pushed[b]==false)
    80. {
    81. pushed[b]=true;
    82.  
    83. q.push(make_pair(b,c+1));
    84. }
    85. }
    86. if(ans==true)
    87. printf("Y\n");
    88. else
    89. printf("N\n");
    90. scanf("%d%d%d",&n,&k,&m);
    91. }
    92. return 0;
    93. }
    94.  
    95.  
    96.  
    97.  
    98.  
    99.  
    100.