POJ1062 昂贵的聘礼 Dijkstra+枚举
2015-05-26 14:29
281 查看
http://poj.org/problem?id=1062
注意Dijkstra需要让不存在的边变成INF 并且注意酋长的等级没有特殊之处,在枚举的一开始就判断枚举的最小等级是不是和酋长的等级冲突。
题目抽象
一张n个节点的带权有向图,每个节点都有一个值,问从各个点出发,到达0节点的最短路加上出发点的值的最小值是多少?(从0节点出发直接算作0号节点的值) 并且其中每个节点都有一个等级,在一条合法的最短路上不允许出现两个节点等级差大于给定值limit.思路
弄了好久的题。和一般的最短路的区别是有一个limit限制。所以我们可以枚举最小等级,让每个节点的等级都试一下最小等级,然后再求最短路。注意Dijkstra需要让不存在的边变成INF 并且注意酋长的等级没有特殊之处,在枚举的一开始就判断枚举的最小等级是不是和酋长的等级冲突。
代码
[code]#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> using namespace std; const int INF = 1000000000; const int maxn = 110; int n,limit; int minlevel; bool used[maxn]; struct node { int cost,cnt,level; }; int eg[maxn][maxn]; node s[maxn]; int d[maxn]; int dijkstra(int ss) { for(int i = 0 ; i < n ; i ++) { d[i] = INF; } d[ss] = 0; while(true) { int v = -1; for(int i = 0 ; i < n ; i ++) { if(!used[i]) { if(v == -1 || d[v] > d[i]) { v = i; } } } if(v == -1) break; used[v] = true; for(int i = 0 ; i < n ; i ++) {//киЁз d[i] = min(d[i],d[v]+eg[v][i]); } } /*cout << ss << endl; for(int i = 0 ; i < n ; i ++) cout << d[i] << endl;*/ return d[0]; } int main() { // freopen("in.txt","r",stdin); scanf("%d%d",&limit,&n); for(int i = 0 ; i < maxn ; i ++) { for(int j = 0 ; j < maxn ; j ++) eg[i][j] = INF; } for(int i = 0 ; i < n ; i ++) { scanf("%d%d%d",&s[i].cost,&s[i].level,&s[i].cnt); for(int j = 0 ; j < s[i].cnt ; j ++) { int a,b; cin >> a >> b; eg[a-1][i] = b; } } int mi = s[0].cost; //for(int i = 0 ; i < n ; i ++) cout << s[i].cost << endl; //cout << s[0].cost << endl; for(int k = 0 ; k < n ; k ++) { minlevel = s[k].level; if(s[0].level < minlevel || s[0].level > minlevel+limit) continue; for(int i = 1 ; i < n ; i ++) { for(int j = 0 ; j < n ; j ++) { if(s[j].level < minlevel || s[j].level > minlevel+limit) used[j] = true; else used[j] = false; } if(!used[i]) { mi = min(mi,dijkstra(i)+s[i].cost); //memset(used,false,sizeof(used)); //cout << dijkstra(i) << "mi = " << mi << endl; } } } cout << mi << endl; return 0; }
相关文章推荐
- [POJ 1062] 昂贵的聘礼 [最短路+枚举] [dijkstra]
- POJ 1062(昂贵的聘礼 枚举 + Dijkstra)
- 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)
- POJ 1062 昂贵的聘礼(最短路径Dijkstra+枚举)
- POJ 1062 昂贵的聘礼 (dijkstra+枚举)
- 昂贵的聘礼 POJ - 1062 Dijkstra + 枚举
- (POJ 1062)昂贵的聘礼 在可选的顶点中求最短路 dijkstra + 枚举
- poj 1062 昂贵的聘礼 【枚举 + dijkstra】
- POJ1062 昂贵的聘礼 ACM解题报告(dijkstra+枚举)
- poj 1062 昂贵的聘礼 枚举等级dijkstra
- [POJ1062] 昂贵的聘礼 枚举等级 + dijkstra
- poj1062 昂贵的聘礼(Dijkstra+枚举等级处理)
- poj 1062 昂贵的聘礼 dijkstra
- POJ1062 昂贵的聘礼 图论(Dijkstra)
- 最短路(Dijkstra) POJ 1062 昂贵的聘礼
- POJ-1062 昂贵的聘礼 区间枚举
- poj 1062 昂贵的聘礼 (dijkstra)
- 昂贵的聘礼(POJ1062 Dijkstra)
- POJ1062 昂贵的聘礼(单源最短路径+枚举)
- POJ1062 昂贵的聘礼(Dijkstra)