PAT2021年春季3月份备考_按照套卷刷真题&心路历程(8-3)

题干:1126 Eulerian Path (25 分)

  • 读题目,学习相关的概念和算法,到最后自己理解并且仿制出代码花了1个小时,拿了满分
  • 推荐一个博客https://www.cnblogs.com/keep23456/p/12518966.html
  • 通过做这题我知道自己在图论和树的问题上面需要更多的训练,而且在做题的时候我能比较明显的感受到自己的进步和提高的过程。。。其实这些知识确实都是需要通过做题的方式来巩固的。。。。单单看书就学进去基本上是不可能的。。。忽然发现我在强化复习考研数据结构与算法之前去备考PAT是多么明智的决定。。。
  • 推荐的博客里面阐述了这道题的基本的意思,而我的代码里面注释比较多,方便你学习这些思想是怎么被落实的,其实学习的过程中有一个明显的误区。。。是我自己犯过的。。。就是总想一口吃个胖子。。。比如说你看我的代码或者别人的博客,如果你的水平和我接近,你一般是不太可能完全看懂所有细节的。。。。这些参考答案是一个作为样本给你学习的。。。。简单来说:你一般要看走马观花的看很多道题的解答以后,才能完全理解其中一道题的解答,再后面你这类题就基本都会做了。。。。
  • // 1126.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <bits/stdc++.h>
    #define max 510
    using namespace std;
    
    int cnt = 0;//被遍历的节点的个数要等于题目给的节点个数才能算连通的
    vector<int> gn[max];
    vector<bool> visited(max,false);
    
    void dfs(int root) {
        visited[root] = true;
        cnt++;
        for (int i = 0; i < gn[root].size(); i++) {//遍历该节点的领接表,邻接表是由地址直接映射的数组和链表组成的
            if (visited[gn[root][i]] == false) {//gn[root][i]访问链表里面的元素,还是图的索引,
                dfs(gn[root][i]);
            }
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        FILE* s;
        freopen_s(&s, "in.txt", "r", stdin);
    #endif // !1
    
        int n, m;
        int even = 0;
        cin >> n >> m;
        int v1, v2;
        for (int i = 0; i < m; i++) {
            cin >> v1 >> v2;
            gn[v1].push_back(v2);
            gn[v2].push_back(v1);//创建图的一种技巧
        }
        for (int i = 1; i <= n; i++) {//i<n的时候会少了最后一个顶点
            if (i > 1)cout << " ";
            printf("%d", gn[i].size());
            if (gn[i].size() % 2 == 0)even++;//无向图的出度和入度是一样的,所以只要考虑有联系的边即可
        }
        cout << endl;
        dfs(1);//遍历的话起点是任意的,通过遍历计算图的连通性
        if (cnt == n && even == n) {
            cout << "Eulerian";
        }
        else if (cnt == n && even == n-2) {
            cout << "Semi-Eulerian";
        }
        else {
            cout << "Non-Eulerian";
        }
        cout << endl;
        return 0;
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Exodus&Focus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值