`
kenby
  • 浏览: 724756 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poj 1062 dijkstra算法求最优价格

阅读更多

 

#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;
}
分享到:
评论

相关推荐

    POJ算法题目分类

    * 贪心:贪心算法是指通过选择当前最优的解来解决问题的方法,如 poj1328、poj2109、poj2586。 * 递归和分治法:递归和分治法是指将问题分解成多个小问题,通过解决小问题来解决大问题,如 poj3295。 * 递推:递推是...

    北大POJ初级-基本算法

    6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树问题(Prim和Kruskal算法)。 7. **字符串处理**:如KMP算法、Rabin-Karp算法、...

    ACM-POJ 算法训练指南

    1. **最短路径**:Dijkstra算法、Bellman-Ford算法、Floyd算法等,用于寻找两点间最短路径(poj1860, poj3259, poj1062, poj2253, poj1125, poj2240)。 2. **最小生成树**:Prim算法和Kruskal算法,用于构建图的...

    poj题目分类

    * 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...

    poj训练计划.doc

    - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:如Prim算法和Kruskal算法,用于找出图中的最小生成树,如`poj1789, poj2485`。 - 拓扑...

    ACM常用算法及其相应的练习题.docx

    + poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 * 最小生成树算法:prim, kruskal + poj1789, poj2485, poj1258, poj3026 * 拓扑排序:poj1094 * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * ...

    poj各种分类

    Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有负权边和所有类型的加权图,而Heap-Dijkstra结合了Dijkstra算法与堆优化,提高了解决大规模图问题的效率。 #### 最小生成树 Prim算法和Kruskal...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**:poj1789, poj2485, poj1258, poj3026 - **解释**:最小生成树算法...

    ACM算法总结大全——超有用!

    2. 最短路径算法:包括Dijkstra算法、Bellman-Ford算法、Floyd算法和堆优化的Dijkstra算法,用于寻找图中两点间最短路径,如poj1062、poj2253等。 3. 最小生成树算法:Prim算法和Kruskal算法用于找到图的最小权值...

    POJ 分类题目 txt文件

    Dijkstra算法用于寻找图中两点间的最短路径,而Bellman-Ford算法可以处理带有负权边的情况;Prim和Kruskal算法则是构造最小生成树的经典算法。例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构...

    数据结构中poj题目算法分类——针对ACM竞赛

    - **最短路径问题**:Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法用于求解单源最短路径。 - **最小生成树**:Prim算法和Kruskal算法用于寻找边权和最小的树形子图。 - **拓扑排序**:对于有向无环图...

    acm新手刷题攻略之poj

    - 包括Dijkstra算法、Bellman-Ford算法以及Floyd算法等,用于求解图中两个节点间的最短路径。 2. **最小生成树** - 推荐题目:[poj1789](https://vjudge.net/problem/POJ-1789)、[poj2485]...

    强大的POJ分类——各类编程简单题及其算法分类

    2. **最短路径算法**:包括Dijkstra、Bellman-Ford、Floyd和堆优化的Dijkstra,如POJ1860、3259、1062、2253、1125和2240。 3. **最小生成树算法**:Prim和Kruskal方法,用于找到图中权重最小的连接所有节点的子树,...

    很快速的提高算法能力.docx

    - **最短路径**:学习Dijkstra、Bellman-Ford、Floyd和Heap+Dijkstra算法,如Poj1125、Poj2240等。 - **最小生成树**:熟悉Prim和Kruskal算法,如Poj1789、Poj2485等。 - **拓扑排序**:了解其原理和应用,如Poj...

    算法训练方案详解

    - **定义**: 包括Dijkstra算法、Bellman-Ford算法和Floyd算法。 - **应用场景**: Dijkstra适用于非负权图中的单源最短路径问题;Bellman-Ford可以处理负权边但不能有负权环;Floyd用于解决任意两点之间的最短路径...

    【最新+免费】ACM主要算法.doc

    2. 最短路径算法:包括Dijkstra、Bellman-Ford、Floyd和Heap+Dijkstra,如POJ 2253和POJ 1125。 3. 最小生成树算法:Prim和Kruskal方法,如POJ 1789。 4. 拓扑排序:如POJ 1094。 5. 二分图的最大匹配:匈牙利算法,...

    POJ 100题代码

    7. 题目1552《Buses》:这道题目与图论相关,可能需要理解最短路径算法,如Dijkstra算法或Bellman-Ford算法,解决城市间公交线路的最短路径问题。 8. 题目3325《Array Partition》:涉及到数组划分问题,可能需要...

    ACM算法总结--最新总结的ACM算法

    2. **贪心算法**(如poj1328, poj2109, poj2586):在每个步骤中做出局部最优选择,试图达到全局最优解,适用于某些特定问题,如活动安排问题、硬币找零问题。 3. **动态规划**(如poj3295):通过将复杂问题分解为...

    poj图论题目汇总

    - **知识点**:本题涉及到两个主要知识点:枚举技术和Dijkstra算法。 - **枚举技术**:通过枚举所有可能的情况来解决问题的一种方法,通常用于处理有限状态空间的问题。 - **Dijkstra算法**:一种用于寻找图中两点...

    POJ题目分类

    - **Dijkstra算法**:适用于带非负权重的有向图和无向图,可以求出图中某一个顶点到其他所有顶点的最短路径。 - **Bellman-Ford算法**:可以处理含有负权边的图,并且可以检测是否存在负权环。 - **Floyd算法**:...

Global site tag (gtag.js) - Google Analytics