dij是單源的,只是從乙個頂點出發到其它點的最短距離,並且它的全值都是正的,不能夠有負值;
bellman-ford 也是單源的,但是他能夠完成負權值的圖,這是dij無法達到的,並且能夠判斷是否存在負環,經過修改可以求最長路;
spfa是在bellman-ford上優化的,所以跟快;
floyd演算法可以求出任意兩點的最短路,索然dij對每個點一次for也能求出,但是複雜度o(n^3)或o(n^2+ne),一次floyd也是o(n^3),
但是floyd更加易懂,簡潔;floyd允許帶負值的邊,但不能有迴路(環);floyd很靈活,可以多種變換;
(個人的理解 不是很深,只懂一點)
1poj3268
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呼叫了...