更多:2011年軟考程序員考試復(fù)習(xí)筆試知識(shí)點(diǎn)整理匯總
16、單源最短路徑
(1)Dijkstra 算法可以用來解決非負(fù)權(quán)重網(wǎng)絡(luò)的單源點(diǎn)最短路徑。
Dijkstra 算法的基本思想就是用貪心策略維護(hù)一棵最短路徑生成樹,先用dist[]數(shù)組維護(hù)一個(gè)最短路徑,dist[v]表示起點(diǎn) v0 與當(dāng)前最短路徑樹中的頂點(diǎn) v 的最短路徑。選擇下一個(gè)頂點(diǎn)時(shí),我們找一條邊
最短路徑 dijsktra 算法模板:
#include
usingnamespace std;
constint maxint = 9999999;
constint maxn = 1010;
intdata[maxn][maxn];//data存放點(diǎn)點(diǎn)之間的距離,
intlowcost[maxn]; //lowcost存放點(diǎn)到start的距離, 從0開始存放
boolused[maxn];//標(biāo)記點(diǎn)是否被選中
intn; //頂點(diǎn)的個(gè)數(shù)
voiddijkstra(int start)//初始點(diǎn)是start的dij算法
{
int i,j;
memset(used, 0, sizeof(used));
//init
for(i = 0; i < n; i++)
lowcost[i] = data[start][i];
used[start] = true;
lowcost[start] = 0;
for(i = 0; i < n-1; i++)
{
//choose min
int tempmin = maxint;
int choose;
for(j = 0; j < n; j++)
{
if(!used[j] && tempmin >lowcost[j])
{
choose = j;
tempmin = lowcost[j];
}
}
used[choose] = true;
//updata others
for(j = 0; j < n; j++)
{
if(!used[j] &&data[choose][j] < maxint && lowcost[choose]+data[choose][j] { lowcost[j] =lowcost[choose]+data[choose][j]; } } } } intmain() { int start , i , j; cin>>n; for(i = 0; i < n; i++) for(j = 0; j < n; j++)//輸入頂點(diǎn)信息 { cin>>data[i][j]; } cin>>start; dijkstra(start); int min = 0; for(i = 0; i < n; i++) { cout< for(i=0;i { for(j=0;j a[i][j]=MAX; for(i=0;i a[i][i]=0; while(edge_amount--) { scanf("%d%d%d",&i,&j,&w); a[i][j]=w; } Bellman_Ford(0); for(i=0;i { printf("dist:%d\t",d[i]); printf("path: %d",P[i]); printf("\n"); } } return 0; }
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |