• PTA数据结构与算法题目集(中文) 7-32


    PTA数据结构与算法题目集(中文)  7-32

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

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

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

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

    输入格式:

    输入第一行给出两个正整数,分别是节点数N (1)和边数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 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<malloc.h>
     5 
     6 typedef struct ENode* Edge;
     7 struct ENode
     8 {
     9     int V1, V2;
    10 };
    11 typedef struct GNode* Graph;
    12 struct GNode
    13 {
    14     int G[1010][1010];
    15     int Ne;
    16     int Nv;
    17 };
    18 
    19 int Degree[1010];
    20 int Collected[1010];
    21 int Flag = 1;
    22 int IsEdge(int V1,int V2,Graph Gra)
    23 {
    24     return Gra->G[V1][V2];
    25 }
    26 void Insert(Graph Gra, Edge E)
    27 {
    28     Gra->G[E->V1][E->V2] = 1;
    29     Gra->G[E->V2][E->V1] = 1;
    30 }
    31 Graph CreateGraph(int Nv)
    32 {
    33     Graph Gra = (Graph)malloc(sizeof(struct GNode));
    34     Gra->Ne = 0;
    35     Gra->Nv = Nv;
    36     for (int i = 1; i <= Gra->Nv; i++)
    37         for (int j = 1; j <= Gra->Nv; j++)
    38             Gra->G[i][j] = 0;
    39     return Gra;
    40 }
    41 
    42 Graph BuildGraph()
    43 {
    44     int N, M;
    45     scanf("%d%d", &N, &M);
    46     Graph Gra = CreateGraph(N);
    47     Edge E = (Edge)malloc(sizeof(struct ENode));
    48     for (int i = 0; i < M; i++)
    49     {
    50         scanf("%d%d", &(E->V1), &(E->V2));
    51         Degree[E->V1]++;
    52         Degree[E->V2]++;
    53         Insert(Gra, E);
    54     }
    55     return Gra;
    56 }
    57 
    58 void DFS(Graph Gra,int V)
    59 {
    60     for(int i=1;i<=Gra->Nv;i++)
    61         if (!Collected[i] && IsEdge(V, i, Gra))
    62         {
    63             Collected[i] = 1;
    64             if (Degree[i] % 2 == 1)
    65                 Flag = 0;
    66             DFS(Gra, i);
    67         }
    68 }
    69 int IsCollected(int Nv)
    70 {
    71     for (int i = 1; i <= Nv; i++)
    72         if (!Collected[i])
    73             return 0;
    74     return 1;
    75 }
    76 int main()
    77 {
    78     Graph Gra = BuildGraph();
    79     DFS(Gra, 1);
    80     if (Flag && IsCollected(Gra->Nv))
    81         printf("1");
    82     else
    83         printf("0");
    84 }
    View Code
  • 相关阅读:
    闭包
    TCL
    [Go] gin框架渲染html字符串
    [Go] 使用packr包把静态文件打包进二进制内
    [javascript] 获取正则子表达式里的内容
    [redis] Zremrangebylex命令移除元素令人困惑不能理解
    [Go] 获取文件夹下面指定模式的文件列表 , 并且获取文件创建时间删除超过30分钟的文件
    [vuejs] 聊天框在overflow:auto中填数据时滚动到底部
    [vuejs] 在vuejs中使用websocket进行实时通讯
    Egret顶级开发者—李昌平
  • 原文地址:https://www.cnblogs.com/57one/p/11649820.html
Copyright © 2020-2023  润新知