[第15次CCFCSP]数据中心

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int cnt=0,ans=0;
int head[N];
int n,m,root;
int maxx=-1;
struct node
{
	int u;
	int v;
	int w;
}edge[N];

int father[N];
void init()
{
	for(int i=1;i<=N;i++)
	{
		father[i]=i;
	}
}
int find_set(int n)
{
	return father[n]==n?n:(father[n]=find_set(father[n]));
}
void union_set(int a,int b)
{
	int x=find_set(a);
	int y=find_set(b);
	if(a!=b)
	{
		father[b]=a;
	}
}
bool cmp(node a,node b)
{
	return a.w<b.w;
}
void kruskal()
{
	sort(edge+1,edge+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		if(cnt==n-1)break;
		int a=find_set(edge[i].u);
		int b=find_set(edge[i].v);
		if(a==b)continue;
		else
		{
			father[b]=a;
			cnt++;
			ans+=edge[i].w;
			maxx=max(maxx,edge[i].w);
		} 
	}
}
int main()
{
	cin>>n>>m>>root;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>edge[i].u>>edge[i].v>>edge[i].w;
	}
	init();
	kruskal();
	cout<<maxx;
	return 0;
}

        通过kruskal算法求出最短路,在把符合条件的边加入总值时每次比较maxx更新最大值,输出即可。

        模板题

<think>好的,我需要帮助用户找到CCF CSP认证第36考试的题解或答案。首先,用户提到的第36考试可能对应的是2020年6月的考试,因为根据引用[2]中的内容,用户提到了202006-4这道题。我需要先确认考试时间与题号的对应关系。 接下来,用户引用了两篇自己的博客内容。引用[1]提到用户从2023年9月开始刷题,覆盖了从2013年12月到2023年10月的题目,但主要做第一题和第二题,现在开始尝试第三题并完善Python知识。这说明用户目前可能在准备CSP认证,需要更多题解资源,尤其是第36考试的高分题解。 引用[2]提到了用户在处理202006-4(1246题)时遇到的死循环问题,特别是在处理两位数的环时出现错误。这可能意味着用户需要具体的解题思路或优化方法,尤其是在动态规划或矩阵快速幂的应用上。 根据这些信息,我需要整理第36考试(2020年6月)的题目解析,尤其是第四题的解决方案。由于用户主要使用Python和Java,可能需要提供这两种语言的代码示例,或者至少是算法思路。 首先,对于CSP考试,通常前两题较简单,第三题开始难度增加。第四题往往涉及较复杂的算法,比如动态规划、图论或数学建模。用户遇到的1246题可能需要状态转移矩阵或快速幂优化,避免直接递归导致的超时或死循环。 查找相关题解时,发现该题可能需要将字符串转换到数字编码,通过状态转移矩阵表示合法转移,并使用矩阵快速幂来高效计算结果。例如,每个状态代表可能的结尾字符,如1、2、4、6,然后构建转移矩阵,考虑不同操作后的状态变化。 此外,用户提到的环问题可能出现在暴力枚举或未优化的递归中,导致无法终止。正确的做法应避免重复计算,通过矩阵快速幂在log(n)时间内解决问题,而不是逐个计算每一步。 因此,回答用户时需要包括以下内容: 1. 确认第36考试对应的年份和题目。 2. 提供各题特别是第四题的解题思路,如状态设计、矩阵构建、快速幂应用。 3. 指出用户遇到的死循环问题可能源于暴力递归,而正确方法需使用高效算法。 4. 给出参考资料或示例代码链接(如果可能的话)。 5. 生成相关问题,帮助用户深入理解相关算法。 需要确保回答中的数学公式正确使用$$...$$格式,例如状态转移矩阵的表示,时间复杂度分析等。同时,引用用户提供的两个引用,说明可能的错误来源和正确方法。</think>关于CCF CSP认证第36考试(2020年6月场)的题目解析,以下是关键信息整理: ### 一、考试题目概述 1. **第一题**:通常为模拟题,考察基础编程能力。例如2020年6月第一题涉及线性分类器的简单几何判断。 2. **第二题**:常为数据结构应用,如稀疏向量的点积计算,需注意大范围数据的高效存储与遍历优化[^1]。 3. **第四题(202006-4 1246)**:字符串动态规划问题,难点在于状态转移的数学建模和矩阵快速幂优化[^2]。 ### 二、第四题(1246)核心解析 #### 1. **问题建模** - **目标**:统计所有长度为$n$且仅由字符$\{1,2,4,6\}$组成的字符串中,不包含给定子串$S$的数量。 - **关键限制**:子串$S$可能长达$200$字符,直接暴力枚举不可行。 #### 2. **状态设计** 定义状态为字符串末尾的$k$个字符($k$为子串$S$长度),但实际可通过自动机简化。例如,当$S=46$时: - 合法状态为:空状态、`4`、`6`,其中`46`为非法终止状态。 - 状态转移需排除生成子串$S$的路径。 #### 3. **矩阵快速幂优化** - **转移矩阵**:构建状态转移矩阵$M$,其中$M_{i,j}$表示从状态$i$转移到状态$j$的方案数。 - **时间复杂度**:矩阵快速幂将复杂度从$O(n)$优化为$O(\log n)$,适用于$n \leq 10^{15}$的情况。 #### 4. **代码框架示例(Python)** ```python MOD = 998244353 def matrix_mult(a, b): n = len(a) return [[sum(a[i][k] * b[k][j] % MOD for k in range(n)) % MOD for j in range(n)] for i in range(n)] def matrix_pow(mat, power): result = [[1 if i == j else 0 for j in range(len(mat))] for i in range(len(mat))] while power > 0: if power % 2 == 1: result = matrix_mult(result, mat) mat = matrix_mult(mat, mat) power //= 2 return result # 示例:S="46"时的转移矩阵(状态为0:空, 1:'4', 2:'6') M = [ [2, 1, 1], # 空状态可添加1/2/4/6,但需拆分到合法状态 [1, 0, 1], # 状态1(末尾是4) [1, 1, 0] # 状态2(末尾是6) ] final_state = matrix_pow(M, n)[0][0] # 初始状态为0 ``` ### 三、常见错误与优化 - **循环问题**:直接递归可能陷入状态环路(如`46→66→46`)[^2]。矩阵快速幂通过数学抽象避免逐层计算。 - **边界处理**:需特别注意子串$S$的前缀与后缀重叠情况,例如$S=121$时,末尾`12`添加`1`会触发匹配。 ### 四、其他题目资源 - **官方题解**:CCF官网提供部分历史试题的简要思路。 - **开源平台**:GitHub和编程社区(如Codeforces、优快云)有考生分享的代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值