POJ1062昂贵的聘礼
2016-11-20 19:47
211 查看
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <iostream> #define max 200 #define INF 10000 using namespace std; int price[max], vis[max], level[max]; int edge[max][max]; int dis[max]; int N, M; void init() { memset(price, 0, sizeof(price)); memset(level, 0, sizeof(level)); for (int i = 0;i <= N;i++) for (int j = 0;j <= N;j++) edge[i][j] = INF; } void read() { int num, np, x;//num替代品编号 np替代品“优惠价格”x替代品个数 for (int i = 1;i <= N;i++) { cin >> price[i] >> level[i] >> x; while(x--) { cin >> num >> np; edge[num][i] = np;//替代品到当前物品的距离定义成“优惠价格” } edge[0][i] = price[i];//原点0到顶点i的边赋成price数组 } } int dijkstra() { memset(dis, INF, sizeof(dis)); for (int i = 1;i <= N;i++) dis[i] = edge[0][i]; for (int i = 1;i <= N;i++) { int min = INF; int k = -1; for (int j = 1;j <= N;j++)//寻找与当前点边集相邻接且距离最小的点 { if (dis[j] <= min && (!vis[j])) { k = j; min=dis[k]; } } if (k == -1) break;//再也找不到可以加入集合的点 break退出循环 vis[k] = 1;//将顶点k加入点边集中 for (int i = 1;i <= N;i++)//将顶点k加入点边集之后 将与新点边集相邻接的更短的边赋值到dis数组中(dis数组更新) if (dis[i] > dis[k] + edge[k][i]&&(!vis[i])) dis[i] = dis[k] + edge[k][i]; } return dis[1]; } int main() { while (scanf("%d%d", &M, &N) != EOF) { init(); read(); int ans = INF; for (int i = 1;i <= N;i++) { int min = level[i]; for (int j = 1;j <= N;j++) { if (level[j] - min > M || (level[j] < min)) vis[j] = 1;//标记走不通 else vis[j] = 0; } int tmp = dijkstra(); if (ans > tmp) ans = tmp; } printf("%d\n", ans); } }
相关文章推荐
- POJ 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼 最短路
- POJ 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼 (最短路)
- poj1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼 最短路 难度:0
- poj 1062(最短路——昂贵的聘礼)
- poj 1062 昂贵的聘礼
- SPFA 最短路 —— POJ 1062 昂贵的聘礼
- poj 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼
- (转)POJ 1062 昂贵的聘礼 (最短路,dijktra算法)
- poj 1062 昂贵的聘礼
- poj1062昂贵的聘礼(题解)最短路
- poj 1062 昂贵的聘礼
- POJ 1062 昂贵的聘礼
- poj-1062 昂贵的聘礼 **