• 2021-2022 ICPC, NERC, Northern Eurasia Onsite L. Labyrinth


    翻译:

    莱斯利和利昂进入了一个迷宫。迷宫由𝑛大厅和𝑚大厅之间的单向通道组成。大厅编号从1到𝑛。

    莱斯利和利昂在大厅开始了他们的旅程𝑠。他们立刻争吵起来,决定各自去探索迷宫。然而,他们希望在旅程结束时再次见面。

    为了帮助Leslie和Leon,你的任务是找到两条不同的路径,从给定的大厅𝑠到另一个大厅𝑡,这样这两条路径除了开始的大厅𝑠和结束的大厅𝑡之外不共用大厅。大厅𝑡还没有确定,所以你可以选择任何一个迷宫的大厅𝑡除了𝑠。

    莱斯利和利昂的路不一定是最短的,但他们的路必须很简单,最多一次去任何一个大厅。此外,除了𝑠和𝑡之外,他们在旅途中不能参观任何公共大厅,即使是在不同的时间。

    输入
    第一行包含三个整数𝑛、𝑚𝑠,哪里𝑛(2≤𝑛≤2⋅105)是顶点的数目,𝑚(0≤𝑚≤2⋅105)是迷宫,边的数量和𝑠(1≤𝑠≤𝑛)开始大厅。

    然后是𝑚带有段落描述的行。每个描述都包含两个整数𝑢𝑖,𝑣𝑖(1≤𝑢𝑖,𝑣𝑖≤𝑛;𝑢𝑖≠𝑣𝑖),表示从𝑢𝑖厅到𝑣𝑖厅的通道。这些通道是单向的。每个元组(𝑢𝑖,𝑣𝑖)在输入中最多出现一次。迷宫可以包含循环,并且不一定以任何方式连接。

    输出
    如果有可能找到所需的两条路径,则输出“possible”,否则输出“Impossible”。

    如果答案存在,输出两个路径描述。每个描述占用两行。描述的第一行包含整数ℎ(2≤ℎ≤𝑛)—路径中的厅数,第二行包含不同的整数𝑤1,𝑤2,…,𝑤ℎ(𝑤1=𝑠;1≤𝑤𝑗≤𝑛;𝑤ℎ=𝑡)——按照经过的顺序排列在道路上的大厅。两条路径必须在同一个顶点𝑡结束。这些路径必须是不同的,这些路径中的所有中间大厅必须是不同的。

    例子
    inputCopy
    5 5 1
    1 2
    2 3
    1 - 4
    4个3
    3个5
    outputCopy
    可能的
    3.
    1 2 3
    3.
    1 4 3
    inputCopy
    5 5 1
    1 2
    2 3
    3 4
    2个5
    5个4
    outputCopy
    不可能的
    inputCopy
    3 3 2
    1 2
    2 3
    3个1
    outputCopy
    不可能的

    思路:看有没有完全不同路径,从相同的起点出发,到一个可以到达的点。所以我们可以先看,没有解的情况,当起点只有一个点相连,这时候必不可能有解。之后我们对起点相连的点,轮流进行的方式,然后标记,如果有能搜到的点,已经被之前的搜到过了就是有解,我们用数组来记录路径,然后记录最后的两个点。然后回溯存点,输出。细节比较复杂,思路比较简单。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace::std;
    15. typedef long long ll;
    16. inline __int128 read(){
    17. __int128 x = 0, f = 1;
    18. char ch = getchar();
    19. while(ch < '0' || ch > '9'){
    20. if(ch == '-')
    21. f = -1;
    22. ch = getchar();
    23. }
    24. while(ch >= '0' && ch <= '9'){
    25. x = x * 10 + ch - '0';
    26. ch = getchar();
    27. }
    28. return x * f;
    29. }
    30. inline void print(__int128 x){
    31. if(x < 0){
    32. putchar('-');
    33. x = -x;
    34. }
    35. if(x > 9)
    36. print(x / 10);
    37. putchar(x % 10 + '0');
    38. }
    39. int n ,m,s;
    40. int f,ff;
    41. vector<int>q[200005];
    42. int ffla[200005];
    43. int back[200005];
    44. bool flag=false;
    45. int ss,ssr;
    46. void dfs(int x,int kl){
    47. ffla[x]=kl;
    48. for (auto next:q[x]) {
    49. if (ffla[next]&&ffla[next]!=kl) {
    50. if(next!=s){
    51. ss=next;ssr=x;
    52. flag=true;
    53. return;
    54. }
    55. }
    56. if (!ffla[next]) {
    57. back[next]=x;
    58. dfs(next, kl);
    59. if (flag) {
    60. return;
    61. }
    62. }
    63. }
    64. }
    65. int main(){
    66. ios::sync_with_stdio(false);
    67. cin.tie(); cout.tie();
    68. cin>>n>>m>>s;
    69. for (int i =0; i
    70. cin>>f>>ff;
    71. q[f].push_back(ff);
    72. }
    73. if (q[s].size()<2) {
    74. printf("Impossible\n");return 0;
    75. }
    76. int rs=1;
    77. ffla[s]=1e7;
    78. for (auto k:q[s]) {
    79. if (flag) {
    80. break;
    81. }
    82. if (ffla[k]&&k!=s) {
    83. ss=k;
    84. ssr=s;
    85. flag=1;
    86. break;
    87. }
    88. back[k]=s;
    89. ffla[k]=rs;
    90. dfs(k, rs);
    91. rs++;
    92. }
    93. if (!flag) {
    94. printf("Impossible\n");return 0;
    95. }
    96. printf("Possible\n");
    97. vector<int>an1;
    98. vector<int>an2;
    99. an2.push_back(ss);
    100. // printf("%d %d",ss,ssr);
    101. while (ss!=s) {
    102. an1.push_back(ss);
    103. ss=back[ss];
    104. }
    105. while (ssr!=s) {
    106. an2.push_back(ssr);
    107. ssr=back[ssr];
    108. }
    109. printf("%d\n%d ",an1.size()+1,s);
    110. for (int i =an1.size()-1; i>=0; i--) {
    111. printf("%d ",an1[i]);
    112. }printf("\n");
    113. printf("%d\n%d ",an2.size()+1,s);
    114. for (int i=an2.size()-1; i>=0; i--) {
    115. printf("%d ",an2[i]);
    116. }printf("\n");
    117. return 0;
    118. }

  • 相关阅读:
    第六课:NIO简介
    如何在 Windows 10上修复0x000006ba错误
    【项目】API接口的加签和验签
    Redis数据类型-Hash-存储结构之dictht字典
    pix2pix学习系列(1):预训练模型测试pix2pix
    【java】JVM内存区域管理
    app逆向(8)|app的加固+脱壳和frida+rpc介绍
    探索光模块的MSA多源协议
    部署bpmn项目实现activiti流程图的在线绘制
    【每日一题】路径总和 III
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128211985