外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)
day 1{
一大堆学习方法及规划(其中告诉我可以无所忌惮的看题解哦)
1广搜bfs {
重点: 参照---马的遍历bfs{
记得判重(不同于spfa)
模板:
#include <queue>
queue < int > q;
int main()
{
q.push( s ) , vis[s] = 1;
while( !q.empty() ) //队列不为空时
{
int now = q.front(); //取出当前元素
q.pop(); //弹出当前元素
for( register int i = 0 ; i < linker[ now ].size() ; i++ ) //链式前向星写法(可用vector) 3 :-----4-----6-----7----9
{
int cur = linker[ now ][i];取出某个起点后所连接(跟随)的一系列点(fans)
if( !vis[ cur ] ) vis[ cur ] = 1 , q.push( cur ); 若这个点未遍历(判重)(区别于spfa) 这个点扔到队列里面
}
}
}
//具体请见马的遍历
2链表(vector写法)和链式前向星(不是特别会写)
用vector实现邻接表的建图
一、vector 简介及基本操作:
1、vector是c++中stl库中封装好的容器,常用定义不定长数组来构建无向图或有向图
. 2、基本操作:
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j)删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear(); vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的, 否则会出错。
vector实现:vector[x].push_back(y);//把y扔到x后面去;
day2 {
1最短路算法{
一般最短路 floyd(n^3){
思想:区间dp;
模板{
for(int k=1;k<=n;k++)//遍历中转站
{
for(int i=1;i<=n;i++)//遍历起点{
for(int j=1;j<=n;j++){//遍历终点
if(i!=j&&i!=k&&j!=k&&f[i][j]>f[i][k]+f[k][j]) //i=j值为0,i=k或j=k时中转站是他自身无意义
f[i][j]=f[i][k]+f[k][j];
}
}
}
当然这个也可以用来做刚开始图的个点之间是否可以走的存储
for(int k=1;k<=n;k++)//遍历中转站
{
for(int i=1;i<=n;i++)//遍历起点{
for(int j=1;j<=n;j++){//遍历终点
if(i!=j&&i!=k&&j!=k) //i=j值为0,i=k或j=k时中转站是他自身无意义
f[i][j]=(f[i][k]&&f[k][j])||f[i][j];
}
}
}
Bellman-Ford算法O(NE)
模板:
#include <bits/stdc++.h>
using namespace std;
int main(){
// 此算法实际上就是一点点靠近真理(最优解)的过程,n为点的个数,m为边的个数
for(int i=1;i<=n;i++){
dis[i]=inf; //所谓dis[i],就是起点到i之间的最短距离
} //全部设为无限大 即所有点现在还都是白点 ,都还未开通
dis[1]=0;//起点肯定是红点 起点到起点距离肯定为0
for(int i=1;i<=n-1;i++){//最不好理解的地方 最坏就是一条直线,一次只能优化一个点到起点距离,即n-1次,不懂可以接着往下看
for(int j=1;j<=m;j++){ //注意 在bellman-fort中 遍历的是边不是点
int x=u[j],y=v[j];//x为一条边j的初始点,y为一条边j的终点
if(dis[x]<inf){//一条边的初始点必须与起点相连,这样才能保证遍历优化其他点到起点的距离
//但是如果dis[x]不是最优解,那么他所优化的其他点也都不是最优解!!!!!
dis[y]=min(dis[y],dis[x]+w[j]);//管他的,先优化了再说(局部优化)
}
//很明显 在一次操作中,所有从起点到与红点相邻的边的终点的值都被优化了一遍,但还没有完
//新的白点变为了红点 所以要继续优化;(或许可以更好哦)
//反正遍历的是边,所有东西都是在一点点的局部优化中所最终优化的 (怪不得很浪费)
//所以说只要知道要最多进行多少次优化(n-1),优化什么(各点到起点最短距离)
//变量是什么(不断被优化的个边之间的距离)!!
//也许当初并不完美,也许之前得出的结论都是错的
//也要有追寻真理的执着
//让一个min来不断优化基础,从而改正错误吧
//一个min行天下
}
}
return 0;
}
剩下的两个再翻一篇吧