外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)

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;
}

剩下的两个再翻一篇吧

猜你喜欢

转载自www.cnblogs.com/sc-pyt-2021-theworld/p/10046482.html