• 欧拉路径与欧拉回路


    经过所有边一次的路径叫做欧拉路径(一笔画),若路径起点和终点相同,称之为欧拉回路

    判定条件

    有向图欧拉路径 一个起点(出度-入度=1),一个终点(入度-出度=1),剩余节点(出度=入度)

    有向图欧拉回路  所以节点(入度=出度)

    无向图欧拉路径 一个起点(度数=奇数),一个终点(度数=奇数),剩余节点(度数为偶数)

    无向欧拉回路, 所有节点度数都是偶数

    以上四条都建立在将有向边视为无向边后,图是连通图

    【模板】欧拉路径 - 洛谷

    有向图中的欧拉回路与欧拉路径

    1. # include
    2. # include
    3. # include
    4. # include
    5. # include
    6. using namespace std;
    7. int nowid[100000+10];
    8. int ru[100000+10],chu[100000+10];
    9. int n,m;
    10. stack<int>st;
    11. vector<int>v[100000+10];
    12. void dfs(int now)
    13. {
    14. for(int i=nowid[now];isize();i=nowid[now])
    15. {
    16. nowid[now]=i+1;
    17. dfs(v[now][i]);
    18. }
    19. st.push(now);
    20. }
    21. int main ()
    22. {
    23. cin>>n>>m;
    24. for(int i=1;i<=m;i++)
    25. {
    26. int x,y;
    27. cin>>x>>y;
    28. chu[x]++;
    29. ru[y]++;
    30. v[x].push_back(y);
    31. }
    32. for(int i=1;i<=n;i++)
    33. {
    34. sort(v[i].begin(),v[i].end());
    35. }
    36. int b=1,e,cntb=0,cnte=0;
    37. int cnt=0,flag=0;
    38. for(int i=1;i<=n;i++)
    39. {
    40. if(ru[i]!=chu[i])
    41. {
    42. flag=1;
    43. }
    44. if(chu[i]-ru[i]==1)
    45. {
    46. cntb++;
    47. b=i;
    48. }
    49. else if(ru[i]-chu[i]==1)
    50. {
    51. cnte++;
    52. }
    53. else if(ru[i]==chu[i])
    54. {
    55. cnt++;
    56. }
    57. }
    58. if(!(cnt==n-2&&cntb==1&&cnte==1)&&flag)
    59. {
    60. cout<<"No";
    61. return 0;
    62. }
    63. dfs(b);
    64. while(!st.empty())
    65. {
    66. cout<top()<<" ";
    67. st.pop();
    68. }
    69. return 0;
    70. }

    无序字母对 - 洛谷

    无向图的,没保证连通性,还需要判断连通性,但貌似本题不判断也可以。

    另外无序字母对不相同说明标记一次边就够了

    1. # include
    2. # include
    3. # include
    4. # include
    5. # include
    6. using namespace std;
    7. vector<int>v[1000];
    8. int du[1000];
    9. bool mp[1000][1000];
    10. stack<int>st;
    11. void dfs(int now)
    12. {
    13. for(auto it:v[now])
    14. {
    15. if(!mp[it][now])
    16. {
    17. mp[it][now]=1;
    18. mp[now][it]=1;
    19. dfs(it);
    20. }
    21. }
    22. st.push(now);
    23. }
    24. int main ()
    25. {
    26. int t;
    27. cin>>t;
    28. while(t--)
    29. {
    30. string s;
    31. cin>>s;
    32. du[s[0]]++;
    33. du[s[1]]++;
    34. v[s[0]].push_back(s[1]);
    35. v[s[1]].push_back(s[0]);
    36. }
    37. for(int i=1;i<=200;i++)
    38. {
    39. sort(v[i].begin(),v[i].end());
    40. }
    41. int cnt=0;
    42. int b=999;
    43. for(int i=1;i<=200;i++)
    44. {
    45. if(du[i]&1)
    46. {
    47. cnt++;
    48. b=min(b,i);
    49. }
    50. }
    51. if(cnt==0)
    52. {
    53. b=999;
    54. for(int i=1;i<=200;i++)
    55. {
    56. if(du[i])
    57. {
    58. b=i;
    59. break;
    60. }
    61. }
    62. if(b==999)
    63. {
    64. cout<<"No Solution";
    65. }
    66. else
    67. {
    68. dfs(b);
    69. while(!st.empty())
    70. {
    71. cout<<(char)(st.top());
    72. st.pop();
    73. }
    74. }
    75. }
    76. else
    77. {
    78. if(cnt==2)
    79. {
    80. dfs(b);
    81. while(!st.empty())
    82. {
    83. cout<<(char)(st.top());
    84. st.pop();
    85. }
    86. }
    87. else
    88. {
    89. cout<<"No Solution";
    90. return 0;
    91. }
    92. }
    93. return 0;
    94. }

    [USACO3.3]骑马修栅栏 Riding the Fences - 洛谷

    和上一题不同的是,本题无向边多个

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int edge[600][600];
    7. int n;
    8. int du[1000];
    9. stack<int>st;
    10. void dfs(int now)
    11. {
    12. for(int i=1;i<=500;i++)
    13. {
    14. if(edge[now][i])
    15. {
    16. edge[now][i]--;
    17. edge[i][now]--;
    18. dfs(i);
    19. }
    20. }
    21. st.push(now);
    22. }
    23. int main()
    24. {
    25. cin>>n;
    26. for(int i=1; i<=n; i++)
    27. {
    28. int x,y;
    29. cin>>x>>y;
    30. edge[x][y]++;
    31. edge[y][x]++;
    32. du[x]++;
    33. du[y]++;
    34. }
    35. for(int i=1;i<=500;i++)
    36. {
    37. if(du[i]&1)
    38. {
    39. dfs(i);
    40. while(!st.empty())
    41. {
    42. cout<top()<<'\n';
    43. st.pop();
    44. }
    45. return 0;
    46. }
    47. }
    48. for(int i=1;i<=500;i++)
    49. {
    50. if(du[i])
    51. {
    52. dfs(i);
    53. while(!st.empty())
    54. {
    55. cout<top()<<'\n';
    56. st.pop();
    57. }
    58. return 0;
    59. }
    60. }
    61. return 0;
    62. }

  • 相关阅读:
    Flink容错机制
    算法题系列8·买卖股票的最佳时机
    【libevent】异步UDP
    MySQL-(3)
    【动态规划】速解简单多状态类问题
    讲解LCD1602自定义字符原理
    电脑重装系统后如何创建睡眠快捷方式
    【CircuitPython】RaspberryPi Pico RP2040 自定义机械键盘实例
    【深入理解java虚拟机】 - JVM字节码指令介绍
    [论文笔记]MacBERT
  • 原文地址:https://blog.csdn.net/jisuanji2606414/article/details/126076644