组合数?dp!

前言:一度以为这个题目是一个组合数的题,但是看完才知道是dp算的,太巧妙

要注意dp数组的初始化问题



cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define int long long

int n, m, q, x;
const int N = (int)1e6 + 5;
int e[N*2], ne[N*2], h[N], idx = 0;
int dep[N];
int vis[N];
int ans[5005];
int dp[5005][5005];
const int Mod = (int)1e9 + 7;

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

void bfs() {
	queue<int> q;
	q.push(x); vis[x] = 1;
	while (q.size()) {
		int u = q.front(); q.pop();
		for (int i = h[u]; i; i = ne[i]) {
			int to = e[i];
			if (vis[to]) continue;
			vis[to] = 1;
			dep[to] = dep[u] + 1; ans[dep[to]]++;
			q.push(to);
		}
	}
}

signed main() {
	cin >> n >> m >> q >> x;
	for (int i = 1; i <= m; i++) {
		int u, v; cin >> u >> v; add(u, v), add(v, u);
	}
	bfs();
	// 似乎需要排列组合? no no
	int ma = 1;
	for (int i = 1; i <= 5000; i++) {
		if (ans[i]) {
			ma = max(ma, i);
		}
		else break;
	}
	// dp[ i ] [ j ] 表示 从距离 i 中选 j 个点
	for (int i = 0; i <= ma; i++) dp[i][0] = 1;
	for (int i = 1; i <= ma; i++) {
		for (int j = 1; j <= i; j++) {
			dp[i][j] += dp[i - 1][j];
			dp[i][j] = (dp[i][j] + dp[i - 1][j - 1] * ans[i] % Mod) % Mod;
		}
	}
	for (int i = 1; i <= q; i++) {
		int k; cin >> k;
		cout << dp[ma][k] << endl;
	}
	return 0;
}
相关推荐
点云侠3 分钟前
PCL 生成三棱锥点云
c++·算法·最小二乘法
兰令水15 分钟前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
临沂堇19 分钟前
刷题日志 | Leetcode Hot 100 哈希
算法·leetcode·哈希算法
玉小格42 分钟前
一次关于Python的总结
算法
伊甸31 小时前
从企业级项目学敏感词过滤:DFA算法与双层缓存实战
java·算法·缓存
bIo7lyA8v1 小时前
算法中的随机化思想及其复杂度收益评估的技术8
算法
数据法师1 小时前
视频文件重复检测工具:基于哈希与视频指纹的三级筛选机制
算法·音视频·哈希算法
其实防守也摸鱼1 小时前
软件安全与漏洞--Windows底层原理与软件逆向工程基础
linux·网络·数据库·算法·安全·安全架构·软件安全与漏洞
bIo7lyA8v2 小时前
算法稳定性与数据分布的内在联系研究的技术8
算法
bIo7lyA8v2 小时前
算法可视化对教学与调试效率的影响分析的技术8
算法