演算法 最短路徑之Dijkstra(II)

2021-08-27 13:34:31 字數 1795 閱讀 4732

建立有向圖:比如,物品1能被替代品2所替代,且所需金幣為200;則存在一條從點2到點1的邊,且邊長為200。

等級處理採用的是列舉。用rank[ ]表示每一節點的等級,節點0表示探險家,節點1表示國王。用m表示等級的限制,那麼探險家可以交易的區間為[rank(1)-m, rank(1)] ,… ,[rank(1), rank(1)+m]。注:[ ]表示閉區間,rank(1)表示國王的等級。

關於所用列舉方法更具體的解釋請參看這裡

。最後一次wa,沒有考慮極端情況:輸入的n為100。將#define max 100改為#define max 101,就ac了。

源**:

1062

accepted

204k

32ms

c1823b

2013-08-09 21:05:13

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#define max 101

#define inf 0xffffff

int edge[max][max];

int rank[max],trade[max];

void init(int n)

min_god=smaller(min_god,dijkstra(n));

} printf("%d\n",min_god);

} return 0;

}

該問題可用(n,m)圖來描述:crossings是圖的頂點,streets是圖的邊;源點是標號為1的頂點,匯點是標號為n的頂點。源點到匯點的每一通路均有一條最短邊,在這些最短邊中找出最大值,此最大值即為the maximum allowed weight。

與之相類似的是poj 2253,poj 2253求解的是最小最長邊,而poj 1797求解最大最短邊。

同樣地,修改鬆弛條件:dis[i]=max,dis[i]}

其中,dis[i]記錄源點到點i所有通路的最短邊。

用memset( )初始化動態陣列時,在指定大小時不能直接sizeof(陣列名)。如:memset(dis,0,sizeof(dis))就是錯誤的,並不能將動態陣列全部置0。

源**:

1797

accepted

4080k

485ms

c1338b

2013-08-11 18:30:42

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#define max 1000

#define inf 0xffffff

int edge[max][max];

void init(int n,int m)

void dijkstra(int n)

} visit[max_node]=1;

count++;

} printf("%d\n\n",dis[n-1]);

free(dis);

free(visit);

}int main()

int smaller(int be,int af)

void dijkstra(int n,int x,int lowcost)

{ int i,count=1,min_lowcost,min_node;

int *visit=(int *) malloc(n*sizeof(int));

for(i=0;i

最短路徑 之Dijkstra演算法

dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...

最短路徑 之Dijkstra演算法

dijkstra演算法 dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for i...

最短路徑之Dijkstra演算法

using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...