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/