2023.6.8 AcWing LeetCode

AcWing

二分 + DFS树遍历

注意,虽然树中边的数量为顶点数-1,但是由于实际中将无向边存为两条有向边,所以数组开辟的边数个数要是顶点数的两倍。

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n, y, x;
int T;
int ans, idx;
int h[N], e[N], ne[N], w[N];

void add(int a, int b, int c){
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; 
}

void dfs(int u, int p){
    ans++;
    for(int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if(j == p) continue;
        if(w[i] < x) continue;
        dfs(j, u);
    }
    
    return ;
}

bool check(int mid){
    x = mid;
    ans = 0;
    dfs(0, -1);
    if(ans <= y) return true;
    return false;
}

int main()
{
    scanf("%d", &T);
    while(T--){
        idx = 0;
        memset(h, -1, sizeof h);
        scanf("%d %d", &n ,&y);
        
        int maxw = -1;
        for(int i = 0; i < n - 1; i++){
            int u, v, w;
            scanf("%d %d %d", &u, &v, &w);
            add(u, v, w);
            add(v, u, w);
            maxw = max(maxw, w);
        }
        
        int l = 0, r = maxw + 1;
        while(l < r){
            int mid = (l + r) >> 1;
            if(check(mid)) r = mid;
            else l = mid + 1;
        }
        
        printf("%d\n", l);
    }
    
    return 0;
}

LeetCode

水题

https://leetcode.cn/problems/string-matching-in-an-array/solution/140-by-sen-xm-cc5t/

posted @ 2022-08-06 09:16  superPG  阅读(22)  评论(0编辑  收藏  举报