#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;
}
分享到:
相关推荐
* 贪心:贪心算法是指通过选择当前最优的解来解决问题的方法,如 poj1328、poj2109、poj2586。 * 递归和分治法:递归和分治法是指将问题分解成多个小问题,通过解决小问题来解决大问题,如 poj3295。 * 递推:递推是...
6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd-Warshall算法)、最小生成树问题(Prim和Kruskal算法)。 7. **字符串处理**:如KMP算法、Rabin-Karp算法、...
1. **最短路径**:Dijkstra算法、Bellman-Ford算法、Floyd算法等,用于寻找两点间最短路径(poj1860, poj3259, poj1062, poj2253, poj1125, poj2240)。 2. **最小生成树**:Prim算法和Kruskal算法,用于构建图的...
* 最短路径算法:例如 Dijkstra、Bellman-Ford、Floyd、Heap+Dijkstra,例如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最小生成树算法:例如 Prim、Kruskal,例如 poj1789、poj2485、poj1258、...
- 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:如Prim算法和Kruskal算法,用于找出图中的最小生成树,如`poj1789, poj2485`。 - 拓扑...
+ poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 * 最小生成树算法:prim, kruskal + poj1789, poj2485, poj1258, poj3026 * 拓扑排序:poj1094 * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * ...
Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有负权边和所有类型的加权图,而Heap-Dijkstra结合了Dijkstra算法与堆优化,提高了解决大规模图问题的效率。 #### 最小生成树 Prim算法和Kruskal...
- **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**:poj1789, poj2485, poj1258, poj3026 - **解释**:最小生成树算法...
2. 最短路径算法:包括Dijkstra算法、Bellman-Ford算法、Floyd算法和堆优化的Dijkstra算法,用于寻找图中两点间最短路径,如poj1062、poj2253等。 3. 最小生成树算法:Prim算法和Kruskal算法用于找到图的最小权值...
Dijkstra算法用于寻找图中两点间的最短路径,而Bellman-Ford算法可以处理带有负权边的情况;Prim和Kruskal算法则是构造最小生成树的经典算法。例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构...
- **最短路径问题**:Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法用于求解单源最短路径。 - **最小生成树**:Prim算法和Kruskal算法用于寻找边权和最小的树形子图。 - **拓扑排序**:对于有向无环图...
- 包括Dijkstra算法、Bellman-Ford算法以及Floyd算法等,用于求解图中两个节点间的最短路径。 2. **最小生成树** - 推荐题目:[poj1789](https://vjudge.net/problem/POJ-1789)、[poj2485]...
2. **最短路径算法**:包括Dijkstra、Bellman-Ford、Floyd和堆优化的Dijkstra,如POJ1860、3259、1062、2253、1125和2240。 3. **最小生成树算法**:Prim和Kruskal方法,用于找到图中权重最小的连接所有节点的子树,...
- **最短路径**:学习Dijkstra、Bellman-Ford、Floyd和Heap+Dijkstra算法,如Poj1125、Poj2240等。 - **最小生成树**:熟悉Prim和Kruskal算法,如Poj1789、Poj2485等。 - **拓扑排序**:了解其原理和应用,如Poj...
- **定义**: 包括Dijkstra算法、Bellman-Ford算法和Floyd算法。 - **应用场景**: Dijkstra适用于非负权图中的单源最短路径问题;Bellman-Ford可以处理负权边但不能有负权环;Floyd用于解决任意两点之间的最短路径...
2. 最短路径算法:包括Dijkstra、Bellman-Ford、Floyd和Heap+Dijkstra,如POJ 2253和POJ 1125。 3. 最小生成树算法:Prim和Kruskal方法,如POJ 1789。 4. 拓扑排序:如POJ 1094。 5. 二分图的最大匹配:匈牙利算法,...
7. 题目1552《Buses》:这道题目与图论相关,可能需要理解最短路径算法,如Dijkstra算法或Bellman-Ford算法,解决城市间公交线路的最短路径问题。 8. 题目3325《Array Partition》:涉及到数组划分问题,可能需要...
2. **贪心算法**(如poj1328, poj2109, poj2586):在每个步骤中做出局部最优选择,试图达到全局最优解,适用于某些特定问题,如活动安排问题、硬币找零问题。 3. **动态规划**(如poj3295):通过将复杂问题分解为...
- **知识点**:本题涉及到两个主要知识点:枚举技术和Dijkstra算法。 - **枚举技术**:通过枚举所有可能的情况来解决问题的一种方法,通常用于处理有限状态空间的问题。 - **Dijkstra算法**:一种用于寻找图中两点...
- **Dijkstra算法**:适用于带非负权重的有向图和无向图,可以求出图中某一个顶点到其他所有顶点的最短路径。 - **Bellman-Ford算法**:可以处理含有负权边的图,并且可以检测是否存在负权环。 - **Floyd算法**:...