建立有向圖:比如,物品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...