组合数?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;
}
相关推荐
酉鬼女又兒1 天前
27. 移除元素
数据结构·算法·排序算法
TracyCoder1231 天前
LeetCode Hot100(28/100)——104. 二叉树的最大深度
算法·leetcode
执着2591 天前
力扣hot100 - 101、对称二叉树
数据结构·算法·leetcode
多恩Stone1 天前
【3D-AICG 系列-1】Trellis v1 和 Trellis v2 的区别和改进
人工智能·pytorch·python·算法·3d·aigc
mit6.8241 天前
模运算|z函数 字符串匹配
算法
阿豪只会阿巴1 天前
【吃饭香系列】二周目|代码随想录算法训练营第七天|454.四数相加II |383. 赎金信 |15. 三数之和 |18. 四数之和
算法
小O的算法实验室1 天前
2025年COR SCI2区,考虑风场影响的无人机搜救覆盖路径规划精确界算法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
xqqxqxxq1 天前
洛谷算法1-3 暴力枚举(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
_OP_CHEN1 天前
【算法基础篇】(五十五)卡特兰数封神之路:从括号匹配到二叉树构造,组合数学的万能钥匙!
算法·蓝桥杯·c/c++·组合数学·卡特兰数·算法竞赛·acm/icpc
郝学胜-神的一滴1 天前
Python美学的三重奏:深入浅出列表、字典与生成器推导式
开发语言·网络·数据结构·windows·python·程序人生·算法