组合数?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 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡2 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴2 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
江畔柳前堤2 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
Navigator_Z2 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode
zander2583 小时前
LeetCode 739:每日温度——为什么单调栈要持续弹出
开发语言·python·算法
2601_955759883 小时前
如何降低 Claude API 批量生产返工率
大数据·人工智能·算法
rannn_1113 小时前
【力扣hot100】链表专题下|138、148、23、146
java·算法·leetcode·链表·开发
ly76893 小时前
分布式一致性算法详解:从 2PC、3PC 到 Paxos、Raft、ZAB
分布式·算法
阿维的博客日记4 小时前
保姆级教程-BBPE分词算法
算法·bbpe