首页 > 其他 > 详细

PTA甲级—树

时间:2021-02-18 15:15:59      阅读:26      评论:0      收藏:0      [点我收藏+]

1004 Counting Leaves (30分)

基本的数据结构——树,复习了链式前向星,bfs遍历判断即可

技术分享图片
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <cmath>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
using namespace std;
const int maxn = 1e4+100;
int n, m, k, par, child;
int cnt, head[maxn];
int level, ans[maxn];
struct node{
    int to, nxt;
}e[maxn];

void add(int u, int v){
    e[++cnt].nxt = head[u];
    e[cnt].to = v;
    head[u] = cnt;
}
void bfs(){
    queue<pii> que;
    que.push({1, 0});
    while(!que.empty()){
        pii tmp = que.front(); que.pop();
        int u = tmp.first, step = tmp.second;
        level = max(level, step);
        if(head[u]){
            for(int i = head[u]; i; i = e[i].nxt)
                que.push({e[i].to, step+1});
        }
        else ans[step]++;
    }
}
int main(){
    scanf("%d%d", &n, &m);
    while(m--){
        scanf("%d%d", &par, &k);
        while(k--){
            scanf("%d", &child);
            add(par, child);
        }
    }
    bfs();
    for(int i = 0; i <= level; i++){
        printf("%d", ans[i]);
        if(i!=level) printf(" ");
    }
}
View Code

 

1053 Path of Equal Weight (30分)

树的遍历,需要思考的点在于如何记录路径并且排序输出

技术分享图片
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define ll long long
#define inf 0x3f3f3f
#define pii pair<int, int>
#define pb push_back
using namespace std;
const int maxn = 1e4+100; 
int n, m, s, cnt;
int val[maxn], fa[maxn];
int t, head[maxn];
vector<int> path[maxn];
struct node{
    int to, nxt;
}e[maxn];
//bool cmp(vector<int> a, vector<int> b){
//    reverse(a.begin(), a.end());
//    reverse(b.begin(), b.end());
//    return 
//}
void add(int u, int v){
    e[++t].to = v;
    e[t].nxt = head[u];
    head[u] = t;
}
void dfs(int u, int sum){
    if(!head[u]&&sum==s) {
        while(u!=-1) path[cnt].pb(val[u]), u = fa[u];
        reverse(path[cnt].begin(), path[cnt].end());
        cnt++;
    }
    for(int i = head[u]; i; i = e[i].nxt){
        int v = e[i].to;
        if(v==fa[u]) continue;
        dfs(v, sum+val[v]);
    }
}
int main(){
    scanf("%d%d%d", &n, &m, &s);
    for(int i = 0; i <= n-1; i++) scanf("%d", &val[i]);
    fa[0] = -1;
    while(m--){
        int u, v, k;
        scanf("%d%d", &u, &k);
        while(k--){
            scanf("%d%", &v);
            add(u, v), fa[v] = u;
        }
    }
    dfs(0, val[0]);
    sort(path, path+cnt);
    for(int i = cnt-1; i >= 0; i--) {
        int len = path[i].size();
        for(int j = 0; j < len; j++)
            cout << path[i][j] << (j==len-1 ? "" : " ");
        cout << endl;
    }
} 
View Code

Reference:

https://www.cnblogs.com/vranger/p/3502885.html

PTA甲级—树

原文:https://www.cnblogs.com/wizarderror/p/14338862.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!