首页 PAT-Travelling Salesman Problem & Counting Nodes in a Binary Search Tree
文章
取消

PAT-Travelling Salesman Problem & Counting Nodes in a Binary Search Tree

    承接昨天的题,做完这两道也就花了一个多小时,最后还剩1小时1分钟,而且四道题都ac了,这套题还是很简单的,明天把哈夫曼树看看,做几道哈夫曼树的题目吧。

    得益于昨天背了背c++的基础知识点,全局变量、数组是在编译阶段申请在全局/静态存储区的,如果不初始化的话,会默认赋值成0,数组的全部元素也是0,bool的话是false。

    得益于前两看了看柳神的代码,于是我也开始精简代码行数,发现确实能节省不少时间。

A1150 Travelling Salesman Problem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream>
#include<vector>
#include<unordered_map>
#include<cstdio>
using namespace std;
const int maxn = 210, inf = 0x3fffffff;
int N, M, k, n, neibghbor[maxn][maxn], u, v, w, mindis = inf, minpath;

int main()
{
    cin >> N >> M;
    fill(neibghbor[0], neibghbor[0] + maxn * maxn, inf);
    for (int i = 0; i < M; i++)
    {
        cin >> u >> v >> w;
        neibghbor[u][v] = w;
        neibghbor[v][u] = w;
    }
    cin >> k;
    for (int i = 1; i <= k; i++)
    {
        cin >> n;
        vector<int> path(n);
        unordered_map<int, int> map;
        int tmpdis = 0;
        bool flag = false;
        for (int j = 0; j < n; j++)
        {
            cin >> path[j];
            map[path[j]]++;
            if (j > 0)
            {
                if (neibghbor[path[j]][path[j - 1]] == inf)
                {
                    flag = true;
                }
                else tmpdis += neibghbor[path[j]][path[j - 1]];
            }
        }
        if (flag) printf("Path %d: NA (Not a TS cycle)\n", i);
        else
        {
            if (path.front() == path.back() && map.size() == N)
            {
                if(path.size() == N + 1) printf("Path %d: %d (TS simple cycle)\n", i, tmpdis);
                else printf("Path %d: %d (TS cycle)\n", i, tmpdis);
                if (tmpdis < mindis)
                {
                    mindis = tmpdis;
                    minpath = i;
                }
            }
            else printf("Path %d: %d (Not a TS cycle)\n", i, tmpdis);
        }
    }
    printf("Shortest Dist(%d) = %d\n", minpath, mindis);
}

    这道题目很简单,但是第一次提交只对了8分,前两个测试点没过,查了下,发现了老错误,我再判断中间有路不连通的时候,直接就break了,但后面很有可能还有节点没有读取,那么就会导致出错,要么就不break,只是改下flag,要么就用getline把剩下的全吸收了。

A1115 Counting Nodes in a Binary Search Tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
struct node
{
    int v;
    node* left = nullptr, * right = nullptr;
    node(int _v) : v(_v) {}
}*Root = nullptr;
const int maxn = 10010;
int n, lowestl = 0, nodesN[maxn], tmp;
void Insert(node*& root, int val)
{
    if (root == nullptr) root = new node(val);
    else if (val <= root->v) Insert(root->right, val);
    else Insert(root->left, val);
}
void travelsal(node* root, int level)
{
    if (root == nullptr) return;
    nodesN[level]++;
    if (level > lowestl) lowestl = level;
    travelsal(root->left, level + 1);
    travelsal(root->right, level + 1);
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> tmp;
        Insert(Root, tmp);
    }
    travelsal(Root, 0);
    printf("%d + %d = %d", nodesN[lowestl], nodesN[lowestl - 1], nodesN[lowestl] + nodesN[lowestl - 1]);
}

    亏这道题还30分呢,这么简单,就一建树和遍历,但就这我还debug了会,有两点:

  • 我的insert函数,在当值小于当前节点值时,应当插入左子树,我给写成right了,怪不得一开始是1+1=2的结果

  • 注意insert的形参root,要加引用,不然不会真的把值加在树上的

本文由作者按照 CC BY 4.0 进行授权