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

day 1{c++

一大堆学习方法及规划(其中告诉我能够无所忌惮的看题解哦)算法

1广搜bfs {数组

重点:  参照---马的遍历bfs{学习

记得判重(不一样于spfa)优化

模板:spa

#include <queue>
 
queue < int > q;
 
int main() 对象

队列

q.push( s ) , vis[s] = 1; string

while( !q.empty() )  //队列不为空时it

  {  

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实现邻接表的建图
1、vector 简介及基本操做:

一、vector是c++中stl库中封装好的容器,经常使用定义不定长数组来构建无向图或有向图

. 二、基本操做:

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

剩下的两个再翻一篇吧

相关文章
相关标签/搜索