一、学习算法
1、最短路径(Floyd:逐个顶点试探法(求每对顶点间的最短距离))
(1、)初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为无穷;
(2、)逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值;
(3、)所有顶点试探完毕,算法结束。
附代码
for(int k=0;k<n;k++)//逐个试探每个顶点为中间节点
for(int i=0;i<n;i++)//找能将这个点加入的关系
for(int j=0;j<n;j++)
if(i!=k&&j!=k&&jl[i][k]+jl[k][j]<jl[i][j])//加入后更小就更新距离和路线
{jl[i][j]=jl[i][k]+jl[k][j];
lx[i][j]=joinList(lx[i][k],lx[k][j]);
}
2、优先队列
(1、)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
(2、)在优先队列中,元素被赋予优先级,当访问元素时,具有最高优先级的元素最先出,通常采用堆数据结构来实现。
3、堆
(1、) 堆是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指完全二叉树。堆的特点是根节点的值最小(或最大),且根节点的两个树也是一个堆。
(2、) 堆的存储不同于链表的存储,堆的存储是用一个一维数组来存储的。
(3、)操作:up,down,insert,delete,change
二、刷题题解
1、# [BOI2009]Radio Transmission 无线传输
## 题目描述
给你一个字符串 $s_1$,它是由某个字符串 $s_2$ 不断自我连接形成的。但是字符串 $s_2$ 是不确定的,现在只想知道它的最短长度是多少。
## 输入格式
第一行一个整数 $L$,表示给出字符串的长度。
第二行给出字符串 $s_1$ 的一个子串,全由小写字母组成。
## 输出格式
仅一行,表示 $s_2$ 的最短长度。
## 样例 #1
### 样例输入 #1
```
8
cabcabca
```
### 样例输出 #1
```
3
```
## 提示
#### 样例输入输出 1 解释
对于样例,我们可以利用 $\texttt{abc}$ 不断自我连接得到 $\texttt{abcabcabc}$,读入的 $\texttt{cabcabca}$,是它的子串。
#### 规模与约定
对于全部的测试点,保证 $1 < L \le 10^6$。
1、由题我们已知,一个由某一个子串不断自我连接而成的串,要我们求出,这个子串长度;
2、举一个例子串是abc,自我连接后成abcabcabcabc;我们发现对它求最大公共前后缀是
后缀:abcabcabcabc
前缀:abcabcabcabc
3、所以我们就知n-整串得最大公共前后缀即可得子串长度
附代码
#include<bits/stdc++.h>
#include<string>
using namespace std;
int net[1001000];
main()
{ char z[1001000];
int n,j=0;
scanf("%d\n%s",&n,z+1);
for(int i=2;i<=n;i++)
{ while(j&&z[j+1]!=z[i]) j=net[j];
if(z[j+1]==z[i]) j++;
net[i]=j;
}
cout<<n-net[n]<<endl;
}