zoukankan      html  css  js  c++  java
  • 哥尼斯堡的“七桥问题”(25分)(欧拉回路,并查集)

    哥尼斯堡的“七桥问题”(25 分)

    哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。

    可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。

    这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?

    输入格式:

    输入第一行给出两个正整数,分别是节点数N (1N1000)和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。

    输出格式:

    若欧拉回路存在则输出1,否则输出0。

    输入样例1:

    6 10
    1 2
    2 3
    3 1
    4 5
    5 6
    6 4
    1 4
    1 6
    3 4
    3 6
    

    输出样例1:

    1
    

    输入样例2:

    5 8
    1 2
    1 3
    2 3
    2 4
    2 5
    5 3
    5 4
    3 4
    

    输出样例2:

    0
     1 /* 
     2 5-32 哥尼斯堡的“七桥问题”  (25分) 
     3 http://pta.patest.cn/pta/test/15/exam/4/question/859 
     4 并查集(用来判断是否连通) 和 一笔画(每个节点的度必须为偶数) 
     5 */  
     6 #include <cstdio>  
     7 #include <cstdlib>  
     8 #include <iostream>  
     9 #include <vector>  
    10 #include <queue>  
    11 #include <map>  
    12 #include <algorithm>  
    13 #include <set>  
    14 #include <string>  
    15   
    16 using namespace std;  
    17   
    18 #define N 1005  
    19   
    20 int n , m ;  
    21   
    22 int degree[N] ;  
    23 int fa[N] ;  
    24   
    25 int find(int x)  
    26 {  
    27     if(x == fa[x])  
    28         return x ;  
    29     return fa[x] = find(fa[x]);  
    30 }  
    31   
    32 void merg(int x, int y)  
    33 {  
    34     fa[find(y)] = find(x) ;  
    35 }  
    36   
    37 int main()  
    38 {  
    39     //freopen("in.txt","r",stdin);  
    40     //freopen("out.txt","w",stdout);  
    41     int i  , u , v;   
    42     while( scanf("%d%d",&n,&m) != EOF)  
    43     {  
    44         for(i = 1 ; i<= n ; i++)  
    45         {  
    46             fa[i] = i ;  
    47             degree[i] = 0 ;  
    48         }  
    49         for(i = 0 ; i< m ; i++)  
    50         {  
    51             scanf("%d%d",&u,&v);  
    52             degree[u] ++;  
    53             degree[v] ++;  
    54             if(find(u) != find(v))  
    55                 merg(u ,v);  
    56         }  
    57           
    58         bool flag1 = true;  
    59         for(i = 1 ;i <= n ; i++)  
    60         {  
    61             if(degree[i] % 2 != 0)  
    62             {  
    63                 flag1 = false ;  
    64                 break;  
    65             }  
    66         }  
    67         if(flag1)  
    68         {  
    69             set<int> faset ;  
    70             for(i = 1 ;i <= n ; i++)  
    71             {  
    72                 faset.insert(find(i));  
    73             }  
    74             if((int)faset.size() == 1)  
    75             {  
    76                 printf("1
    ");  
    77             }else{  
    78                 printf("0
    ");  
    79             }  
    80         }else{  
    81             printf("0
    ");  
    82         }  
    83     }  
    84     return 0 ;  
    85 }  
    1. /* 
    2. 5-32 哥尼斯堡的“七桥问题”  (25分) 
    3. http://pta.patest.cn/pta/test/15/exam/4/question/859 
    4. 并查集(用来判断是否连通) 和 一笔画(每个节点的度必须为偶数) 
    5. */  
    6. #include <cstdio>  
    7. #include <cstdlib>  
    8. #include <iostream>  
    9. #include <vector>  
    10. #include <queue>  
    11. #include <map>  
    12. #include <algorithm>  
    13. #include <set>  
    14. #include <string>  
    15.   
    16. using namespace std;  
    17.   
    18. #define N 1005  
    19.   
    20. int n , m ;  
    21.   
    22. int degree[N] ;  
    23. int fa[N] ;  
    24.   
    25. int find(int x)  
    26. {  
    27.     if(x == fa[x])  
    28.         return x ;  
    29.     return fa[x] = find(fa[x]);  
    30. }  
    31.   
    32. void merg(int x, int y)  
    33. {  
    34.     fa[find(y)] = find(x) ;  
    35. }  
    36.   
    37. int main()  
    38. {  
    39.     //freopen("in.txt","r",stdin);  
    40.     //freopen("out.txt","w",stdout);  
    41.     int i  , u , v;   
    42.     while( scanf("%d%d",&n,&m) != EOF)  
    43.     {  
    44.         for(i = 1 ; i<= n ; i++)  
    45.         {  
    46.             fa[i] = i ;  
    47.             degree[i] = 0 ;  
    48.         }  
    49.         for(i = 0 ; i< m ; i++)  
    50.         {  
    51.             scanf("%d%d",&u,&v);  
    52.             degree[u] ++;  
    53.             degree[v] ++;  
    54.             if(find(u) != find(v))  
    55.                 merg(u ,v);  
    56.         }  
    57.           
    58.         bool flag1 = true;  
    59.         for(i = 1 ;i <= n ; i++)  
    60.         {  
    61.             if(degree[i] % 2 != 0)  
    62.             {  
    63.                 flag1 = false ;  
    64.                 break;  
    65.             }  
    66.         }  
    67.         if(flag1)  
    68.         {  
    69.             set<int> faset ;  
    70.             for(i = 1 ;i <= n ; i++)  
    71.             {  
    72.                 faset.insert(find(i));  
    73.             }  
    74.             if((int)faset.size() == 1)  
    75.             {  
    76.                 printf("1 ");  
    77.             }else{  
    78.                 printf("0 ");  
    79.             }  
    80.         }else{  
    81.             printf("0 ");  
    82.         }  
    83.     }  
    84.     return 0 ;  
    85. }  
  • 相关阅读:
    将iso镜像转换为docker镜像
    Linux awk使用方法~~整理
    Linux sed使用方法
    Linux 环境变量梳理
    学习docker——命令总结
    Golang 字符串操作--使用strings、strconv包
    WebSocket实现一个聊天室
    学习WebSocket
    PHP面试题整理
    php使用gd库输出中文内容的图片
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8536177.html
Copyright © 2011-2022 走看看