#Z0060. Peaks

该博客介绍了如何利用邻接表结构解决图论问题,具体为在给定n个点和m条无向边的图中,计算有多少个点的权值大于其所有直接相邻点的权值。通过遍历每个节点及其子节点,判断权值大小,最终得出满足条件的节点数量。示例代码展示了如何实现这一算法。

Description

有n个点,m条无向边,给定这n个点的权值和这m条边连结的点.

求有多少个点比它只经过一条边就能到达的所有点各自的权值都更大.

Format

Input

第一行给出N,M 第二行给出N个点的权值 接下来M行,每行两个数字,代表边的情况

N,M<=1e5

Output

如题

Samples

输入数据 1

4 3
1 2 3 4
1 3
2 3
2 4

Copy

输出数据 1

2

 思路:

用邻接表存树,存好后枚举所有点,找出它所有子节点,并判断它是否比它所有子节点各自的权值都更大,是则ans++,最后输出ans即可。


#include <bits/stdc++.h>
using namespace std;
int n,m,idx,t,x,y,h[1000001],vtx[1000001],nex[1000001],a[1000001],ans;
void f(int a,int b)
{
  idx++;
  vtx[idx] = b;
  nex[idx] = h[a];
  h[a] = idx;
}
int main()
{
  scanf("%d%d",&n,&m);
  for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
  memset(h,-1,sizeof(h));
  for(int i = 1; i <= m; i++)
  {
    scanf("%d%d",&x,&y);
    f(x,y);
    f(y,x);
  }
  for(int i = 1; i <= n; i++)
  {
    int fl = 0,p = h[i];
    while(p != -1)
    {
      if(a[i] <= a[vtx[p]])
      {
        fl = 1;
        break;
      }
      p = nex[p];
    }
    if(fl == 0) ans++;
  }
  printf("%d",ans);
  return 0;
}
/*
4 4
0 0 1
1 0 2
0 3 1
1 2 3
*/

分析下列代码:import tflite_runtime.interpreter as tflite import numpy as np from scipy.signal import butter, filtfilt import smbus import time # 传感器配置 ADXL345_ADDR = 0x53 I2C_BUS = 1 # 初始化I2C bus = smbus.SMBus(I2C_BUS) bus.write_byte_data(ADXL345_ADDR, 0x2D, 0x08) # 进入测量模式 # 加载TFLite模型 interpreter = tflite.Interpreter(model_path="bearing_model_quant.tflite") interpreter.allocate_tensors() input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 巴特沃斯滤波器设计 def butter_bandpass(lowcut, highcut, fs, order=5): nyq = 0.5 * fs low = lowcut / nyq high = highcut / nyq b, a = butter(order, [low, high], btype='band') return b, a def bandpass_filter(data, lowcut, highcut, fs, order=5): b, a = butter_bandpass(lowcut, highcut, fs, order=order) y = filtfilt(b, a, data) return y # 读取三轴加速度计数据 def read_acceleration(): data = bus.read_i2c_block_data(ADXL345_ADDR, 0x32, 6) x = (data[1] << 8) | data[0] y = (data[3] << 8) | data[2] z = (data[5] << 8) | data[4] x = x * 0.004 if x < 32768 else (x - 65536) * 0.004 y = y * 0.004 if y < 32768 else (y - 65536) * 0.004 z = z * 0.004 if z < 32768 else (z - 65536) * 0.004 return np.array([x, y, z]) # 特征提取 def extract_features(signal): features = [ np.max(signal), # 峰值 np.mean(np.abs(signal)), # 平均绝对值 np.std(signal), # 标准差 np.var(signal), # 方差 np.sqrt(np.mean(signal ** 2)) # RMS ] return np.array(features) # 主循环 while True: # 采集1秒数据(采样率1kHz) data = [] start_time = time.time() while time.time() - start_time < 1.0: accel = read_acceleration() data.append(accel[0]) # 使用X轴数据 time.sleep(0.001) # 预处理 filtered = bandpass_filter(data, 500, 5000, 1000) # 带通滤波 features = extract_features(filtered) # TFLite推理 input_data = np.array([features], dtype=np.float32) interpreter.set_tensor(input_details[0]['index'], input_data) interpreter.invoke() output = interpreter.get_te
06-26
import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks, get_window from scipy.ndimage import convolve1d def awgn(signal, snr, method='measured'): """ 添加加性高斯白噪声(AWGN) :param signal: 输入信号(复数或实数) :param snr: 目标信噪比(dB) :param method: 功率计算方式('measured'测量输入功率/'fixed'固定功率=1) :return: 加噪后的信号 """ if method == 'measured': sig_power = np.mean(np.abs(signal) ** 2) else: sig_power = 1.0 # 计算噪声功率 noise_power = sig_power / (10 ** (snr / 10)) # 生成复数噪声 if np.iscomplexobj(signal): noise = np.sqrt(noise_power / 2) * (np.random.randn(*signal.shape) + 1j * np.random.randn(*signal.shape)) else: noise = np.sqrt(noise_power) * np.random.randn(*signal.shape) return signal + noise d_lambda = 0.5 # 阵元间距与波长比 rx_num = 8 # 接收天线阵元数 n = 1000 # 采样快拍数 signum = 3 # 信源数目 theta0 = [-30, 0, 20] # 真实来波角度 snr = 10 # 信噪比 def mvdr(): s = np.random.randn(signum, n) + 1j * np.random.randn(signum, n) # 远场窄带信号 a = np.exp(1j * 2 * np.pi * d_lambda * np.sin(np.deg2rad(theta0))[None, :] * np.arange(rx_num)[:, None]) # 导向矢量 x = a @ s # 接收信号 y = awgn(x, snr, 'measured') # 添加噪声的接收信号 r = y @ y.T.conjugate()/n # 接收数据的协方差矩阵 r_ = np.linalg.inv(r) # 协方差矩阵的逆矩阵 thetascan = np.arange(-90, 90 + 0.1, 0.1) # 扫描角度范围 _as = np.exp(1j * 2 * np.pi * d_lambda * np.sin(np.deg2rad(thetascan))[None, :] * np.arange(rx_num)[:, None]) # 多个导向矢量 num = 0 p = np.zeros(len(thetascan), dtype=np.complex_) # 谱峰函数初始化 for i in thetascan: result = _as[:, num][:, np.newaxis].T.conjugate() @ r_ @ _as[:, num][:, np.newaxis] p[num] = 1 / result.item() num += 1 # print(p[0]) # print(p[600]) # print(p[900]) # print(p[1100]) return p, r_, y def draw(p): plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文字体 plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号 thetascan = np.arange(-90, 90 + 0.1, 0.1) # 扫描角度范围 rp = np.real(p) # 取实数部分 ip = np.imag(p) # # 绘制散点图 # plt.scatter(thetascan, rp) # # # 添加标题和标签 # plt.title('功率图') # plt.xlabel('角度') # plt.ylabel('功率') # # # 显示图形 # plt.show() # # # 绘制散点图 # plt.scatter(thetascan, ip) # # # 添加标题和标签 # plt.title('查看复数') # plt.xlabel('角度') # plt.ylabel('功率') # # # 显示图形 # plt.show() # 创建一个包含 1 行 2 列的子图布局 fig, axes = plt.subplots(1, 2, figsize=(12, 6)) # 在第一个子图中绘制实部散点图 axes[0].scatter(thetascan, rp) axes[0].set_title('功率图') axes[0].set_xlabel('角度') axes[0].set_ylabel('功率') # 在第二个子图中绘制虚部散点图 axes[1].scatter(thetascan, ip) axes[1].set_title('功率图复数部分(误差?)') axes[1].set_xlabel('角度') axes[1].set_ylabel('功率') # 显示图形 # plt.show() def locate(p): rp = np.real(p) thetascan = np.arange(-90, 90 + 0.1, 0.1) angle = [] post = [] # 高斯平滑滤波 window_size = 23 sigma = 1 window = get_window(('gaussian', sigma), window_size) smoothed_arr = convolve1d(rp, window / window.sum()) # 查找极大值 peaks, _ = find_peaks(smoothed_arr) # 低频率极大值 for i in peaks: if smoothed_arr[i] > 0.1: angle.append(thetascan[i]) post.append(i) return angle, post def denoise(y, r_, angle, i): # W=R^−1A(A^HR^−1A)^−1b a = np.exp(1j * 2 * np.pi * d_lambda * np.sin(np.deg2rad(angle))[None, :] * np.arange(rx_num)[:, None]) b = np.zeros(len(angle))[:, np.newaxis] b[i] = 1 z = a.T.conjugate() @ r_ @ a z_ = np.linalg.inv(z) w = r_ @ a @ z_ @ b s = w.T.conjugate() @ y return s def drawmei(s): # 进行FFT变换 fft_y = np.fft.fft(s) x = np.arange(n) # 频率个数 abs_y = np.abs(fft_y) # 取复数的绝对值,即复数的模(双边频谱) angle_y = np.angle(fft_y) # 取复数的角度 abs_y = abs_y.flatten() angle_y = angle_y.flatten() plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文字体 plt.rcParams['axes.unicode_minus'] = False # 设置正常显示符号 # 绘制双边振幅谱(未归一化) plt.figure() plt.plot(x, abs_y) plt.title('双边振幅谱(未归一化)') # 绘制双边相位谱(未归一化) plt.figure() plt.plot(x, angle_y) plt.title('双边相位谱(未归一化)') plt.show() # 按装订区域中的绿色按钮以运行脚本。 if __name__ == '__main__': # 输出方位谱 p, r_, y = mvdr() draw(p) # 声源定位 angle, post = locate(p) # 选择目标信号 print(angle) print('请选择目标信号:') # i = input() i = 1 # 计算降噪信号 s = denoise(y, r_, angle, i) # 画图 drawmei(s) 这段代码是对频域还是时域做的mvdr
09-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值