#include <stdio.h>
#include <string.h>
#define DEBUG
#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__)
#else
#define debug(...)
#endif
#define MAX 101
#define MAX_INT 200000
int graph[MAX][MAX]; /* graph[0][i]表示物品i的原始价格,graph[v][w]表示优惠价格 */
int rank[MAX];
int n;
int price[MAX]; /* price[v]买物品v的最低价格 */
char final[MAX]; /* 顶点是否加入了集合, 加入了集合就意味着该顶点从图中排除掉 */
int dijkstra()
{
int i, v, w, min;
//开始时,各个物品的最优价格就是原始价格
for (v = 1; v <= n; v++) {
price[v] = graph[0][v];
}
for (i = 1; i <= n; i++) {
debug("未加入集合的点及其花费 = ");
for (w = 1; w <= n; w++) {
if (!final[w]) {
debug("%d:%d ", w, price[w]);
}
}
debug("\n");
min = MAX_INT;
v = 0;
//从未加入集合的顶点中选择花费最小的物品
for (w = 1; w <= n; w++) {
if (!final[w]) {
if (price[w] < min) {
min = price[w];
v = w;
}
}
}
if (v == 0) break;
debug("顶点%d的花费最小,加入集合, price[%d] = %d\n", v, v, price[v]);
final[v] = 1;
//找到v的所有邻接点
for (w = 1; w <= n; w++) {
if (!final[w] && graph[w][v] > 0 && (price[v]+graph[w][v]) < price[w]) {
price[w] = price[v] + graph[w][v];
debug("更新顶点%d的最小花费为%d\n", w, price[w]);
}
}
}
return price[1];
}
int main()
{
int limit;
int i, j, m;
int adj, cost, min_cost;
scanf("%d %d", &limit, &n);
//建图
for (i = 1; i <= n; i++) {
scanf("%d %d %d", &graph[0][i], rank+i, &m);
while (m--) {
scanf("%d", &adj);
scanf("%d", &graph[i][adj]);
}
}
//打印图
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
debug("%d ", graph[i][j]);
}
debug("\n");
}
min_cost = MAX_INT;
//枚举等级范围, 比如酋长的等级为5, 等级限制为2,
//那么每个人允许的等级为(3,4,5,6,7), 一条最优路线出现的等级范围可以是3-5, 4-6, 5-7
for (i = rank[1]-limit; i <= rank[1]; i++) {
//对于范围(i, i+limit), 确定哪些顶点可以用
debug("对于范围(%d,%d)允许的顶点为\n", i, i+limit);
for (j = 1; j <= n; j++) {
if (rank[j] < i || rank[j] > i+limit) { /* 不在范围内的点排除掉 */
final[j] = 1;
}
else {
final[j] = 0;
debug("%d ", j);
}
}
debug("\n");
cost = dijkstra();
debug("范围(%d,%d)的花费为%d\n", i, i+limit, cost);
if (cost < min_cost) {
min_cost = cost;
}
}
printf("%d\n", min_cost);
return 0;
}
分享到:
相关推荐
北大POJ1062-Expensive dowry【dijkstra】 解题报告+AC代码
poj 1062 昂贵的聘礼 代码 单源最短路径的Dijkstra算法
POJ各题算法分类和题目推荐 ACM必看 POJ各题算法分类和题目推荐 ACM必看 POJ各题算法分类和题目推荐 ACM必看
dijkstra 算法 需要考虑重边.........
poj1087贪心算法实验报告 poj1087贪心算法实验报告
POJ中级图算法所有题目【解题报告+AC代码】 我的所有POJ解题报告 http://blog.csdn.net/lyy289065406/article/details/6642573
poj acm题解,包括绝大部分poj题目的题解,可以供acm爱好者学习研究
POJ各题算法分类和题目推荐.pdf
poj上的算法题目分类,对于大家想练习算法的同鞋可以参考一下,里面按类列出了各种算法的题号。
供初学编程基本算法的人练习使用,在poj.grids.cn上
解决算法问题 poj1082, poj1150, poj1180, poj1201, poj1222,代码完成所给题目要求。
北大POJ初级-图算法 解题报告+AC代码
北大POJ初级-基本算法 解题报告+AC代码
POJ题目分类,列出了所有的类目,里面写了一些很好的框架。
业余爱好。所以,算法不一定好,CODING也不一定佳,效率不一定高,只是能通过online judge而已。
POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。
北大POJ中级-基本算法 解题报告+AC代码
关于C++ 算法 北大网站POJ 八数码问题
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序 (poj1094) (5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020) ...
poj1113 melkman算法求凸包, 使用STL