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;
}
剩下的兩個再翻一篇吧