20號就是藍橋杯的省賽了,準備了半年,現在進入了最後的準備階段,把幾大經典演算法和一些c++ 上必備的技巧做乙個總結。
第一,dijkstra。為什麼從dijkstra說起,因為這是最經典,最基礎,使用率最廣的圖演算法之一。
void dijkstra()
shortestdist=0;
shortestpoint=1;
shortest[1]=0;
ifvisited[1]=true;
already=1;
while(already<=v);
line l[linenumber+1];
int leng[v+1];
for(int i=1;i<=v;i++)
leng[1]=0;
for(int i=1;i<=v-1;i++)
} }
for(int i=1;i<=linenumber;i++)
} return;
}
注意事項:bellman-ford是遍歷邊,遍歷的迴圈次數是v-1次,v是點的數量,不是邊的數量。
如果是無向圖,則遍歷邊的時候,一條邊遍歷兩次,相當於兩條邊,只是起點和重點的次序顛倒了。
**如下:
void flyod()
}} }
return;
}
沒有太多的注意事項。
第四:最小生成樹 prim演算法。
最簡單的最小生成樹演算法。
**如下:
void prim()
ifvisited[1]=true;
minpoint=1;
minlength=0;
for(int i=1;i<=v-1;i++);
int cmp(const void *a,const void *b)
int find(int a)
bool join(int a,int b)
else
return true;
}void kruskal()
} return;
}
第六:最小點覆蓋,最大匹配數,匈牙利演算法。
又一大比賽中常常出現的演算法。最小點覆蓋=最大匹配數。匈牙利演算法基本**如下:
bool ifvisited[y+1];
int ancestor[y+1];
bool dfs(int a)
} }return false;
}void xiongyali()
for(int i=1;i<=x;i++)
if(dfs(i)==true)
} return;
}
另外,兩大公式:
最大匹配數=最小點覆蓋;
最小路徑覆蓋=拆點前點數量-最大匹配數/2;
第七:0-1揹包,最短兩段子序列的動態規劃。
拿0-1揹包和子串行來說事,是因為這兩個問題是動態規劃的啟蒙問題,具有非常高的代表性。
首先說一下0-1揹包問題,典型解法:
for(int i=0;i<=itemnumber;i++)
for(int i=1;i<=itemnumber;i++)
}
初始化dp[0][n];然後從i開始遍歷。
兩段最短子串行問題,這個問題涉及三個陣列,分別為前i個字元包括i組成的最大連續序列長度,後i個字元包括i組成的最大連續序列長度,前i個字元可以組成的最大序列,不包括i:
dp[0]=0;
a[100];
b[100];
for(int i=1;i<=n;i++)
a[0]=0;
for(int i=1;i<=n;i++)
else
}b[n]=0;
for(int i=n-1;i>=0;i--)
result=-inf;
for(int i=0;iresult)
}return result;
第八:最大流演算法,ek
最大流是用ek做,當然也可以km,ek比較直觀,好上手,在比賽中比較合適。
int flow[v];
int former[v];
bool ifvisited[v];
bool bfs()
for(int i=1;i<=v;i++)
former[1]=1;
flow[1]=inf;
ifvisited[1]=true;
push(1);
while(!q.empty())
} }if(flow[v]==0)
else
}int ek()
result+=flow[v];
bfs();
min=flow[v];
} return result;
}
九,排序演算法
直接插入排序,希爾排序,堆排序,氣泡排序,快速排序,歸併排序
藍橋杯第四屆個人賽
小明正看著 203879 這個數字發呆。原來,203879 203879 41566646641 這有什麼神奇呢?仔細觀察,203879 是個6位數,並且它的每個數字上的數字都是不同的,並且它平方後的所有數字上都不出現組成它自身的數字。具有這樣特點的6位數還有乙個,請你找出它!再歸納一下篩選要求 1...
2023年04月25日個人賽
a romaji 題意 本題比較簡單,給你乙個字串,要你判斷字串中的每乙個子音字元後面是否有乙個母音字元。題解 簡單簽到題,模擬即可。include include include define ll long long using namespace std intmain else if f 1...
2023年04月19日個人賽
題意 這個題意就是給你乙個錯誤的排序方式,要求你在它的這個排序方式下判斷是否存在正確的執行結果。若存在正確的結果,則輸出 1,否則輸出乙個例子說明是錯誤的。題目的輸入是元素的個數n。題解 這一題比較有意思,很容易判斷出只有當n 1 or n 2時執行結果是正確的,其餘的情況都是錯誤的。這樣我們就構造...