當下最重要的還是做好下一步計畫,平衡好時間。
不管是usaco的題目還是別的oj上的題目,還是慢下來,思考明白。要把思考作為第一要義,思考清楚之後,寫**只是水到渠成的結果。演算法要及其熟,基本的板子要非常熟。
本週圖論最短路徑演算法和最小生成樹演算法,以前只是聽過,現在學過才發現如此有趣,能夠解決很多問題。
總結知識:
1.floyed-warshall演算法 o(n3)適用於出現負邊權的情況,關鍵在那步鬆弛操作
#includeint main()
//floyd-warshall演算法核心語句
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j] )//鬆弛操作
e[i][j]=e[i][k]+e[k][j];
//輸出最終的結果
for(i=1;i<=n;i++)
printf("\n");
}return 0;
}//求多源最短路 //鄰接矩陣的方法,輸出的是任意兩點的距離矩陣
2.dijkstra演算法o (n2)
#include#include#define maxn 1000
#define inf 0x3f3f3f
int e[maxn][maxn];//存圖
int dis[maxn];//記錄起點到i的最長的距離
int book[maxn];//標記點
int n,m;//n為頂點,m為邊
void dijstra()
book[1]=1;
for(i=1 ; i<=n-1 ; i++)
}} for(i=1 ; i<=n ; i++) }
int main()
for(int i=1 ; i<=m ; i++)
dijstra();
} return 0;
}
3.spfa演算法:
#include#include#include#includeusing namespace std;
#define maxn 1000
int first[maxn];//first[i]記錄以i為起點的最後一條邊的儲存位置
int next[maxn];//next[i]記錄與i同起點的上一條邊的儲存位置
int u[maxn],v[maxn],w[maxn];
int dis[maxn];//記錄起點到i的最長的距離
int book[maxn];//標記點
int c[maxn];//統計次數
int n,m;//n為頂點,m為邊
int flag;//標記
int spfa(int s,int n)
}} }
}int main()
spfa(1,n);
if(flag)
printf("有負權迴路\n");
else
} return 0;
}/*
bellman演算法:
for(int k=1;k<=n-1;k++)//進行n-1次鬆弛
for(int i=1;i<=m;i++)//列舉每一條邊
if(dis[v[i]]>dis[u[i]]+w[i])//嘗試鬆弛每一條邊
dis[v[i]]=dis[u[i]]+w[i];
*/
acm 週中學習總結
初步接觸動態規劃,確確實實感受到了動態規劃的不死板而且靈活的尋找最優思路的精妙,簡單來說 動態規劃就是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推 或者說分治 的方式去解決。動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。前面剛剛接觸貪心演算法,在很多情況下,用貪心策略可以...
acm週中學習總結
這週新開了搜尋演算法的學習,到目前為止,初步接觸了一些搜尋的題目和用法。繼續感悟 搜尋是一種利用列舉和遞迴尋找目標的演算法。核心是對路徑的列舉和遞迴操作 遞迴是搜尋的基礎 搜尋分為廣度優先搜尋 bfs 和深度優先搜尋 dfs 廣度優先搜尋就是逐層列舉,逐層查詢,這一層不列舉完不進行下一層。而深度優先...
2019 10 9週中學習總結
感悟 把乙個知識搞明白,搞透徹,需要長期的思考,對問題思路的積累同樣需要長期的思考。所以,長期的思考相當重要!而對知識和 的熟練運用也需要長久的訓練。關於專業的課程,深入下來都是很精妙的,像是資料結構的課程,我以前對於stl裡的資料結構封裝掌握的雖然不是太好 因為常用的只有vector,map,se...