【题解】JZOJ3852 单词接龙

题意

单词接龙,但是后两个字母匹配。求匹配环的单词平均长度的最大值。

正解

单词为边,前后两组字母为点,于是这个图只有 2 6 2 26^2 262 个点。问题转化为求环的平均边长的最大值。

二分这个答案,所有边都减去这个值。若存在正环,则答案可以变大,否则变小。判环用 SPFA,最短路变成最长路就可以判正环了。答案的精度只有 1 0 − 2 10^{-2} 10−2,实数二分容易通过。

最大平均值就是分数规划裸题。------dzr

这个分数规划不懂什么意思。

实现

注意判环的时候是入队次数大于 2 6 2 26^2 262 而不是大于 n n n。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
const double eps = 1e-4;
int n, cnt = 0, fir[N], nxt[N * N], to[N * N], sum[N], vis[N], rt;
char s[N];
double val[N * N], dis[N];
void ade(int u, int v, double w) { cnt++, nxt[cnt] = fir[u], fir[u] = cnt, to[cnt] = v, val[cnt] = w; }
queue<int> q;
bool spfa(double x) {
	memset(sum, 0, sizeof(sum)), memset(dis, -0x3f, sizeof(dis)), dis[rt] = sum[rt] = 0, q.push(rt), vis[rt] = 1;
	while (!q.empty()) {
		int h = q.front();
		q.pop(), vis[h] = 0;
		for (int i = fir[h]; i; i = nxt[i])
			if (dis[to[i]] < dis[h] + val[i] - x) {
				dis[to[i]] = dis[h] + val[i] - x, sum[to[i]] = sum[h] + 1;
				if (sum[to[i]] > 27 * 27) return true;
				if (!vis[to[i]]) vis[to[i]] = 1, q.push(to[i]);
			}
	}
	return false;
}
int main() {
	scanf("%d", &n);
	for (int i = 1, len; i <= n; i++) {
		scanf("%s", s + 1), len = strlen(s + 1);
		if (len != 1) ade((s[1] - 'a' + 1) * 27 + s[2] - 'a' + 1, (s[len - 1] - 'a' + 1) * 27 + s[len] - 'a' + 1, len), rt = (s[1] - 'a' + 1) * 27 + s[2] - 'a' + 1;
	}
	double l = 2.0, r = 1000.0;
	int fl = 0;
	while (r - l > eps) {
		double mid = (l + r) / 2.0;
		if (spfa(mid)) l = mid, fl = 1;
		else r = mid;
	}
	if (fl) printf("%.2lf", l);
	else printf("No solution.");
	return 0;
}
相关推荐
张人玉1 小时前
C# 常量与变量
java·算法·c#
weixin_446122462 小时前
LinkedList剖析
算法
百年孤独_3 小时前
LeetCode 算法题解:链表与二叉树相关问题 打打卡
算法·leetcode·链表
我爱C编程3 小时前
基于拓扑结构检测的LDPC稀疏校验矩阵高阶环检测算法matlab仿真
算法·matlab·矩阵·ldpc·环检测
算法_小学生3 小时前
LeetCode 75. 颜色分类(荷兰国旗问题)
算法·leetcode·职场和发展
运器1233 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
算法_小学生3 小时前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
岁忧3 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
alphaTao3 小时前
LeetCode 每日一题 2025/6/30-2025/7/6
算法·leetcode·职场和发展
ゞ 正在缓冲99%…3 小时前
leetcode67.二进制求和
算法·leetcode·位运算