1. 程式人生 > >圖論入門小結

圖論入門小結

ont sed min 邊表 bsp 訪問 真的 傳遞閉包 fec

1.傳遞閉包 和弗洛伊德一樣的三個循環...不過從三角形松弛變成了判斷兩個點是否都有一條到某一個中間節點的路徑,若有則兩點聯通. 復雜度n^3

2.弗洛伊德 任意兩點間最短路

三角形性質 dis[x]+len[x][y]>=dis[y];//某一點到x的距離+x與y之間的距離>=該點到y的距離 松弛就是把不滿足上述要求的最短距離改為滿足的...
復雜度n^3 三個循環,中間節點放最外面 技術分享
1 for(){// k的循環
2     for(){// i的循環
3         for(){// j的循環
4             if(dis[i][k]+dis[k][j]>=dis[i][j]){
5 dis[i][j]=dis[i][k]+dis[k][j]; 6 } 7 } 8 } 9 }
View Code

初始化:

沒有相連的邊則權值為正無窮,用memset全部初始化為10即可; 自己到自己的距離為0; 163博客真的對強迫癥太不友好了QAQ手動縮進渾身難受. 3.迪傑斯特拉 單源最短路 可用堆優化雖然還不會但是還是要大寫加粗 鄰接表和矩陣都可以用 要求不能有負權 1.找距離所求點最短距離的點; 2.然後以該點為中間點對其他所有未訪問的點做松弛同時對該點做訪問過的標記; 3.如果能找到沒有訪問過的點,返回1,否則結束;
復雜度n^2. 技術分享
 1 void work(int st){
 2     for(int i=1;i<=n;i++){
 3         dis[i]=maps[st][i];
 4     }
 5     memset(vis,0,sizeof(vis));
 6     vis[st]=1;
 7     dis[st]=0;
 8     for(int i=1;i<=n;i++){
 9         int minn=99999999;
10         int k=0;
11         for(int j=1;j<=n;j++){
12             if
(dis[j]<=minn&&(!vis[j])){ 13 minn=dis[j]; 14 k=j; 15 } 16 } 17 if(k==0){ 18 return; 19 } 20 vis[k]=1; 21 for(int j=1;j<=n;j++){ 22 if((maps[k][j]+dis[k]<=dis[j])&&(!vis[j])){ 23 dis[j]=dis[k]+maps[st][j]; 24 } 25 } 26 } 27 }
View Code

4.Bellman_ford算法 判斷是否有負環

5.SPFA 改進上面的 4用邊表 5用鄰接表+隊列 p196自己翻書好了..... 6.最小生成樹 p200

圖論入門小結