k短路演算法
A. c 語言知識清單
1.1 基本數據結構
1. 數組
2. 鏈表,雙向鏈表
3. 隊列,單調隊列,雙端隊列
4. 棧,單調棧
1.2 中級數據結構
1. 堆
2. 並查集與帶權並查集
3. hash 表
自然溢出
雙hash
1.3 高級數據結構
1. 樹狀數組
2. 線段樹,線段樹合並
3. 平衡樹
Treap 隨機平衡二叉樹
Splay 伸展樹
* Scapegoat Tree 替罪羊樹
4. 塊狀數組,塊狀鏈表
5.* 樹套樹
線段樹套線段樹
線段樹套平衡樹
* 平衡樹套線段樹
6.可並堆
左偏樹
*配對堆
7. *KDtree,*四分樹
1.4 可持久化數據結構
1. 可持久化線段樹
主席樹
2. * 可持久化平衡樹
3. * 可持久化塊狀數組
1.5 字元串相關演算法及數據結構
1. KMP
2. AC 自動機
3. 後綴數組
4. *後綴樹
5. *後綴自動機
6. 字典樹 Trie
7. manacher
1.6 圖論相關
1. 最小生成樹
prim
kruskal
2. 最短路,次短路,K短路
spfa
dijkstra
floyd
3. 圖的連通
連通分量
割點,割邊
4. 網路流
最大流
最小割
費用流
分數規劃
5. 樹相關
樹上倍增,公共祖先
樹鏈剖分
樹的分治演算法(點分治,邊分治,*動態?樹分治)
動態樹 (LCT,*樹分塊)
虛樹
*prufer編碼
7. 拓撲排序
8. 歐拉圖
9. 二分圖
*KM演算法
匈牙利演算法
1.7 數學相關
1. (擴展)歐幾里得演算法,篩法,快速冪
斐蜀定理
更相減損術
2. 歐拉函數與*降冪大法
3. 費馬小定理
4. 排列組合
lucas定理
5. 乘法逆元
6. 矩陣乘法
7. 數學期望與概率
8. 博弈論
sg函數
樹上刪邊游戲
9. *拉格朗日乘子法
10. 中國剩餘定理
11. 線性規劃與網路流
12. 單純型線性規劃
13. 辛普森積分
14. 模線性方程組
15. 容斥原理與莫比烏斯反演
16. 置換群
17. 快速傅里葉變換
18. *大步小步法(BSGS),擴展BSGS
1.8 動態規劃
1. 一般,背包,狀壓,區間,環形,樹形,數位動態規劃
記憶化搜索
斯坦納樹
背包九講
2. 斜率優化與* 四邊形不等式優化
3. 環 + 外向樹上的動態規劃
4. *插頭動態規劃
1.9 計算幾何
1. 計算幾何基礎
2. 三維計算幾何初步
3. *梯形剖分與*三角形剖分
4. 旋轉卡殼
5. 半平面交
6. pick定理
7. 掃描線
1.10 搜索相關
1. bfs,dfs
2. A* 演算法
3. 迭代加深搜索,雙向廣搜
1.11 特殊演算法
1. 莫隊演算法,*樹上莫隊
2. 模擬退火
3. 爬山演算法
4. 隨機增量法
1.12 其它重要工具與方法
1.模擬與貪心
2. 二分,三分法(求偏導)
3. 分治,CDQ分治
4. 高精度
5. 離線
6. ST表
1.13 STL
1. map
2. priority_queue
3. set
4. bitset
5. rope
1.14 非常見演算法
1. *朱劉演算法
2. *弦圖與區間圖
其實以上的演算法能學完1/3就已經很好了
望採納,謝謝
B. ACM進階指南
大一上學期:
必學:
1.C語言基礎語法必須全部學會
a)推薦「語言入門」分類20道題以上
b)提前完成C語言課程設計
2.簡單數學題(推薦「數學」分類20道以上)
需要掌握以下基本演算法:
a)歐幾里德演算法求最大公約數
b)篩法求素數
c)康托展開
d)逆康托展開
e)同餘定理
f)次方求模
3.計算幾何初步
a)三角形面積
b)三點順序
4.學會簡單計算程序的時間復雜度與空間復雜度
5.二分查找法
6.簡單的排序演算法
a)冒泡排序法
b)插入排序法
7.貪心演算法經典題目
8.高等數學
以下為選修:
9.學會使用簡單的DOS命令(較重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什麼是絕對路徑與相對路徑
c)學會使用C語言調用DOS命令
d)學會在命令提示符下調用你自己用C語言編寫的程序,並使用命令行參數給自己的程序傳參(比如自己製作一個file.exe實現與命令基本功能一致的功能)
e)學會編寫bat批處理文件
10.學會Windows系統的一些小知識,如設置隱藏文件,autoRun.inf的設置等。
11.學會編輯注冊表(包括使用注冊表編輯器regedit和使用DOS命令編輯注冊表)
12.學會使用組策略管理器管理(gpedit.msc)組策略。
大一下學期:
1.掌握C++部分語法,如引用類型,函數重載等,基本明白什麼是類。
2.學會BFS與DFS
a)迷宮求解(最少步數)
b)水池數目(NYOJ27)
c)圖像有用區域(NYOJ92)
d)樹的前序中序後序遍歷
3.動態規劃(15題以上),要學會使用循環的方法寫動態規劃,同時也要學會使用記憶化搜索的方法。
a)最大子串和
b)最長公共子序列
c)最長單調遞增子序列(O(n)與O(n log n)演算法都需要掌握)
d)01背包
e)RMQ演算法
4.學會分析與計算復雜程序的時間復雜度
5.學會使用棧與隊列等線性存儲結構
6.學會分治策略
7.排序演算法
a)歸並排序
b)快速排序
c)計數排序
8.數論
a)擴展歐幾里德演算法
b)求逆元
c)同餘方程
d)中國剩餘定理
9.博弈論
a)博弈問題與SG函數的定義
b)多個博弈問題SG值的合並
10.圖論:
a)圖的鄰接矩陣與鄰接表兩種常見存儲方式
b)歐拉路的判定
c)單最短路bellman-ford演算法dijkstra演算法。
d)最小生成樹的kruskal演算法與prim演算法。
11.學會使用C語言進行網路編程與多線程編程
12.高等數學
13.線性代數
a)明確線性代數的重要性,首先是課本必須學好
b)編寫一個Matrix類,進行矩陣的各種操作,並求編寫程序解線性方程組。
c)推薦做一兩道「矩陣運算」分類下的題目。
以下為選修,隨便選一兩個學學即可:
14.(較重要)使用C語言或C++編寫簡單程序來調用一些簡單的windows API,或者在linux下進行linux系統調用,其目的是明白什麼是API(應用程序介面)。
15.網頁設計
a)學習靜態網頁技術(html+css+javascript)
b)較具有藝術細胞的可以試試Photoshop
c)php或其它動態網頁技術
16.學習matlab,如果想參加數學建模大賽的話,需要學這個軟體。
大一假期(如果留校集訓)
1.掌握C++語法,並熟練使用STL
2.試著實現STL的一些基本容器和函數,使自己基本能看懂STL源碼
3.圖論
a)使用優先隊列優化Dijkstra和Prim
b)單源最短路徑之SPFA
c)差分約束系統
d)多源多點最短路徑之FloydWarshall演算法
e)求歐拉路(圈套圈演算法)
4.進行復雜模擬題訓練
5.拓撲排序
6.動態規劃進階
a)完全背包、多重背包等各種背包問題(參見背包九講)
b)POJ上完成一定數目的動態規劃題目
c)狀態壓縮動態規劃
d)樹形動態規劃
7.搜索
a)回溯法熟練應用
b)復雜的搜索題目練習
c)雙向廣度優先搜索
d)啟發式搜索(包括A*演算法,如八數碼問題)
8.計算幾何
a)判斷點是否在線段上
b)判斷線段相交
c)判斷矩形是否包含點
d)判斷圓與矩形關系
e)判斷點是否在多邊形內
f)判斷點到線段的最近點
g)計算兩個圓的公切線
h)求矩形的並的面積
i)求多邊形面積
j)求多邊形重心
k)求凸包
選修
9.可以學習一種C++的開發框架來編寫一些窗體程序玩玩(如MFC,Qt等)。
10.學習使用C或C++連接資料庫。
大二一整年:
1.數據結構
a)單調隊列
b)堆
c)並查集
d)樹狀數組
e)哈希表
f)線段樹
g)字典樹
2.圖論
a)強連通分量
b)雙連通分量(求割點,橋)
c)強連通分量與雙連通分量縮點
d)LCA、LCA與RMQ的轉化
e)二分圖匹配
i.二分圖最大匹配
ii.最小點集覆蓋
iii.最小路徑覆蓋
iv.二分圖最優匹配
v.二分圖多重匹配
f)網路流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效演算法(任一)
iii.最小費用最大流
iv.最大流最小割定理
3.動態規劃多做題提高(10道難題以上)
4.數論
a)積性函數的應用
b)歐拉定理
c)費馬小定理
d)威樂遜定理
5.組合數學
a)群論基礎
b)Polya定理與計數問題
c)Catalan數
6.計算幾何
a)各種旋轉卡殼相關演算法
b)三維計算幾何演算法
7.理解資料庫原理,學會SQL語句
8.學好計算機組成原理
9.學習Transact-SQL語言,學會使用觸發器,存儲過程,學會資料庫事務等。
10.圖論二
a)網路流的各種構圖訓練(重要)
b)最小割與最小點權覆蓋等的關系(詳見《最小割模型在信息學競賽中的應用》一文)
c)次小生成樹
d)第k短路
e)最小比率生成樹
11.線性規劃
12.動態規劃更高級進階
13.KMP演算法
14.AC自動機理論與實現
15.博弈論之Alpha-beta剪枝
C. 迪傑斯特拉演算法和a*演算法區別
迪傑斯特拉是求單源最短路,而A*演算法的用武之地是在求第k短路時,因為求第k短路迪傑斯特拉無法處理了
D. 做論文急需matlab實現的k短路程序,懇求哪位大俠幫助,十分感謝,好人一生平安!
參考Matlab自帶的函數 shortestpath ,裡面有'Dijkstra' 演算法可以使用
E. Dijkstra求最短路我已經明白了,但是次短路……
/*
*題目大意:
*在一個有向圖中,求從s到t兩個點之間的最短路和比最短路長1的次短路的條數之和;
*
*演算法思想:
*用A*求第K短路,目測會超時,直接在dijkstra演算法上求次短路;
*將dist數組開成二維的,即dist[v][2],第二維分別用於記錄最短路和次短路;
*再用一個cnt二維數組分別記錄最短路和次短路的條數;
*每次更新路徑的條數時,不能直接加1,,應該加上cnt[u][k],k為次短路徑或者最短路徑的標記;
*圖有重邊,不能用鄰接矩陣存儲;
*不知道為什麼,題目上說的是N and M, separated by a single space, with 2≤N≤1000 and 1 ≤ M ≤ 10000;
*而我的代碼硬是把N開成1W了才過,求解釋,RE了無數次,擦;
**/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=11111;
const int M=111111;
const int INF=0xffffff;
struct node
{
int to;
int w;
int next;
};
node edge[N];
int head[N];
int dist[N][2],cnt[N][2];
bool vis[N][2];
int n,m,s,t,edges;
void addedge(int u,int v,int w)
{
edge[edges].w=w;
edge[edges].to=v;
edge[edges].next=head[u];
head[u]=edges++;
}
int dijkstra()
{
int k;
for(int i=0; i<=n; i++)
{
dist[i][0]=dist[i][1]=INF;
vis[i][0]=vis[i][1]=0;
cnt[i][0]=cnt[i][1]=0;
}
cnt[s][0]=1,dist[s][0]=0;
for(int i=1; i<=n*2; i++)
{
int u=-1;
int min_dist=INF;
for(int j=1; j<=n; j++)
for(int flag=0; flag<2; flag++)
if(!vis[j][flag]&&dist[j][flag]<min_dist)
{
min_dist=dist[j][flag];
u=j;
k=flag;
}
if(u==-1)
break;
vis[u][k]=true;
for(int e=head[u]; e!=-1; e=edge[e].next)
{
int j=edge[e].to;
int tmp=dist[u][k]+edge[e].w;
if(tmp<dist[j][0])//tmp小於最短路徑長:
{
dist[j][1]=dist[j][0];//次短路徑長
cnt[j][1]=cnt[j][0];//次短路徑計數
dist[j][0]=tmp;//最短路徑長
cnt[j][0]=cnt[u][k];//最短路徑計數
}
else if(tmp==dist[j][0])//tmp等於最短路徑長:
{
cnt[j][0]+=cnt[u][k];//最短路徑計數
}
else if(tmp<dist[j][1])//tmp大於最短路徑長且小於次短路徑長:
{
dist[j][1]=tmp;//次短路徑長
cnt[j][1]=cnt[u][k];//次短路徑計數
}
else if(tmp==dist[j][1])//tmp等於次短路徑長:
{
cnt[j][1]+=cnt[u][k];//次短路徑計數
}
}
}
int res=cnt[t][0];
if(dist[t][0]+1==dist[t][1])//判斷最短路和次短路是否相差1
res+=cnt[t][1];
return res;
}
int main()
{
//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
edges=0;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
int u,v,w;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
scanf("%d%d",&s,&t);
printf("%d\n",dijkstra());
}
return 0;
}
F. 帶權值無向圖 Yen演算法求前K短路
恩,用c++實現了。
G. oppo r9計算機有沒有高級演算法
oppo r9計算機沒有高級演算法。
計算器,是現代人發明的可以進行數字運算的電子機器。一般由運算器控制器存儲器鍵盤顯示器、電源和一些可選外圍設備及電子配件、通過人工或機器設備組成。
現代的電子計算器能進行數學運算的手持電子機器,擁有集成電路晶元、但結構比電腦簡單得多,可以說是第一代的電子計算機( 電腦)、且功能也較弱,但較為方便與廉價,可廣泛運用於商業交易中,是必備的 辦公用品之一。除顯示計算結果外,還常有溢出指示、錯誤指示等。計算器電源採用交流轉換器或電池,電池可用交流轉換器或太陽能轉換器再充電。為節省電能,計算器採用 CMOS工藝製作的大規模集成電路。
H. C++ 圖的遍歷 路徑搜索
搜索一個最優,廣度擴展優先。(但是內存問題很嚴重,因為節點個數指數增長。)
搜索所有結果。首先要解決重復路徑的問題,一般可用一個Hash函數,記錄每個結點。方法當然是遞歸。具體怎麼做,我也沒寫過,沒遇到過這種要求。
搜索一定路徑下的,所有結果,這個就好辦了。優先演算法就不用考慮了,優先路徑找到了,也要返回繼續找其它的。所以直接考慮遞歸所有可能。記錄路徑。(效率方面的話:路徑很長的話,還是應該Hash並記錄所遍歷過的結點的狀態。短的話,可以直接在搜索完後,去掉重復路徑即可。)
我人懶,就不寫代碼了。
I. 高級演算法有哪些
數學:離散對數 N次剩餘 Mobius函數計算 數值積分 高階代數求根 快速冪 快速傅里葉變換 分三類
圖論:前向星、Tarjan演算法、2SAT、第k短路、LCA、弦圖判定
計算機幾何中的多邊形、圓、三維問題
數據結構:ST表、動態樹、塊狀鏈表、樹鏈剖分