最短路的一些理解

2022-03-11 06:52:58 字數 2839 閱讀 3231

dij是單源的,只是從乙個頂點出發到其它點的最短距離,並且它的全值都是正的,不能夠有負值;

bellman-ford 也是單源的,但是他能夠完成負權值的圖,這是dij無法達到的,並且能夠判斷是否存在負環,經過修改可以求最長路;

spfa是在bellman-ford上優化的,所以跟快;

floyd演算法可以求出任意兩點的最短路,索然dij對每個點一次for也能求出,但是複雜度o(n^3)或o(n^2+ne),一次floyd也是o(n^3),

但是floyd更加易懂,簡潔;floyd允許帶負值的邊,但不能有迴路(環);floyd很靈活,可以多種變換;

(個人的理解 不是很深,只懂一點)

1

poj3268

2很多牛,要到x這個點,來回多少時間;

3正向,反向2次spfa,2個值相加,然後取最大;

4 #include5 #include

6 #include7

#define inf 999999999

8using

namespace

std;

9struct

node

10edge1[100003],edge2[100003

];15

int head1[1003],dis1[1003],head2[1003],dis2[1003

];16

intn,m,t,index1,index2;

17void add1(int x,int y,int

z)18

25void add2(int x,int y,int

z)26

33void spfa1(int

u)3459}

60}61}

62}63void spfa2(int

u)6489}

90}91}

92}93int

main()

94110

111spfa1(t);

112113

/*for(i=1;i<=n;i++)

114printf("%d ",dis1[i]);

115printf("\n");

*/116

117spfa2(t);

118119

/*for(i=1;i<=n;i++)

120printf("%d ",dis2[i]);printf("\n");

*/121

122int max=0

;123

for(i=1;i<=n;i++)

124128 printf("

%d\n

",max);

129}

130 }

/*

poj2570

floyd演算法來找到所有可能的路徑;

用二進位制26位表示路徑;

0000000000.......111,這個表示abc;

floyd時 map[i][j]|=map[i][k]&map[k][j];

|表示有新的路徑 那麼就合併路徑,&表示存在這個路;

最後遍歷26個字母即可;

*///

poj2570

#include#include

int map[203][203

];int

n;int

main()

}//floyd

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

for(int k=1;k<=n;k++)

char

ii;

while(1

)

}if(!map[x][y])

putchar('\n

');}

putchar('\n

');}}//

poj2263

/*floyd來求解最大能夠載重;

應為a->c可以有2種情況 a->b,b->c或者a->c,要得到a->c這條道路最大的載重量,由於a,b,c這三條路的載重不同,

所以要找出a->b,b->c的最小載重,因為如果取大的,另外一條就不能了,然後再取直接到和間接到的最大值,

此時可以用floyd來解決問題;

*/#include

#include

#define inf 99999999

int map[205][205

];int num;//

統計city

intn,m;

char s[20],e[20

];char in1[30],in2[30

];char city[205][50

];int max(int x,int

y)int min(int x,int

y)int inset(char

a) }

num++;

strcpy(city[i],a);

returni;}

intfloyd()

intx,y;

x=inset(s);

y=inset(e);

return

map[x][y];

}int

main()

scanf(

"%s %s

",s,e);

int ans=floyd();

printf(

"scenario #%d\n

",++ff);

printf(

"%d tons\n

",ans);

printf("\n

");}

}

從dp角度對最短路的又一些理解

spfa通常用來解決最短路問題 在圖論中,又有一類特殊的最短路模型一一dag 眾所周知,dag可以通過dp解決,當然求最短路的演算法也同樣適用於dag 而普通的圖,可能會含有環,這就造成了後效性,所以不能用dp解決,但可以仿照dp的思想,寫乙個類似dp的方程 令 dis u 表示源點到 u 的最短路...

堆疊的一些理解

堆疊是一種執行 後進先出 演算法的資料結構。設想有乙個直徑不大 一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律 先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以 先進後出 就是這種結構的特點。堆疊就是這...

const 的一些理解

以前覺得自己對const還是有些理解的,今天一兄弟問了乙個問題才讓我對這個東西又加深了些了解 class temp public void output void func const temp a a.output 就這麼簡單乙個東西,眨眼一看,沒什麼問題,但是編譯是不會通過的,因為func呼叫了...