外校培訓前三節課知識集合綱要(我纔不會告訴你我前兩節只是單純的忘了)

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

剩下的兩個再翻一篇吧

相關文章
相關標籤/搜索