poj1062昂贵的聘礼(Dijkstra**)

 1 /*
 2    题意: 物主有一个物品,价值为P,地位为L, 以及一系列的替代品Ti和该替代品所对应的"优惠"Vi
 3    g[u][i] 表示的是u物品被i物品替换后的优惠价格!(u>0, i>0)
 4    g[u][0]表示不用替换该物品的实际价格 !
 5    d[0]表示的是第一个物品经过一系列的物品替换之后的最少优惠价格!
 6
 7    思路:每当我们通过Dijkstra算法得到离源点(1)最近的距离的节点 p的时候(也就是1...pre[p], p)这条
 8    路径上的物品互相替换后得到最优价格,我们需要判断是否满足路径上的任意两个节点的地位差的绝对值是否
 9    <=m, 如果不是,那么这条路经就废掉了!要从新找最短路!
10 */
11 #include<iostream>
12 #include<cstdio>
13 #include<cstring>
14 #include<algorithm>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17
18 int g[105][105];
19
20 int d[105];
21 int L[105];
22 int vis[105];
23 int pre[106];
24 int m, n;
25 int minP, maxP;
26
27 bool dfs(int p){
28     if(p==1) return true;
29     if(abs(minP-L[pre[p]])>m || abs(maxP-L[pre[p]])>m){
30        g[pre[p]][p]=INF;//这条路径往回走的过程中,如果发现某两个节点的地位差的绝对值>m, 这一条边无效!
31        return false;    //注意:不要改变其他路径的存在情况!
32     }
33     if(minP>L[pre[p]]) minP=L[pre[p]];
34     if(maxP<L[pre[p]]) maxP=L[pre[p]];
35     return dfs(pre[p]);
36 }
37
38 void Dijkstra(){
39    memset(d, 0x3f, sizeof(d));
40    memset(vis, 0, sizeof(vis));
41    d[1]=0;
42    vis[1]=1;
43    int root=1;
44    int minLen, p;
45
46    for(int j=1; j<=n; ++j){
47           minLen=INF;
48        for(int i=0; i<=n; ++i){
49           if(g[root][i]){
50               if(!vis[i] && d[i]>d[root]+g[root][i]){
51                  d[i]=d[root]+g[root][i];
52                  pre[i]=root;
53               }
54               if(!vis[i] && minLen>d[i]){
55                   minLen=d[i];
56                   p=i;
57               }
58           }
59        }
60         minP=maxP=L[p];
61         if(p && !dfs(p)){//从路径的地步往上走,看一下时候满足条件
62            while(p!=1){
63                d[p]=INF;
64                p=pre[p];
65            }
66            j=0;//从头开始寻找其他的路径!
67            root=1;
68            memset(vis, 0, sizeof(vis));
69            vis[root]=1;
70            continue;
71         }
72         root=p;
73         vis[root]=1;
74    }
75 }
76
77
78 int main(){
79     while(scanf("%d%d", &m, &n)!=EOF){
80         memset(g, 0x3f, sizeof(g));
81         for(int i=1; i<=n; ++i){
82             int p, x;
83             scanf("%d%d%d", &p, &L[i], &x);
84             g[i][0]=p;
85             while(x--){
86                int v, w;
87                scanf("%d%d", &v, &w);
88                g[i][v]=w;
89             }
90         }
91         Dijkstra();
92         printf("%d\n", d[0]);
93     }
94     return 0;
95 } 

poj1062昂贵的聘礼(Dijkstra**),布布扣,bubuko.com

时间: 2024-10-11 12:16:18

poj1062昂贵的聘礼(Dijkstra**)的相关文章

POJ1062 昂贵的聘礼 Dijkstra+枚举

http://poj.org/problem?id=1062 题目抽象 一张n个节点的带权有向图,每个节点都有一个值,问从各个点出发,到达0节点的最短路加上出发点的值的最小值是多少?(从0节点出发直接算作0号节点的值) 并且其中每个节点都有一个等级,在一条合法的最短路上不允许出现两个节点等级差大于给定值limit. 思路 弄了好久的题.和一般的最短路的区别是有一个limit限制.所以我们可以枚举最小等级,让每个节点的等级都试一下最小等级,然后再求最短路. 注意Dijkstra需要让不存在的边变成

POJ1062昂贵的聘礼[最短路建模]

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45892   Accepted: 13614 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

poj 1062 昂贵的聘礼 Dijkstra算法,中等难度,,,一道让我累觉不爱的题目

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38474   Accepted: 11132 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

poj 1062 昂贵的聘礼 [dijkstra]

昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出

poj1062 昂贵的聘礼 (DFS)

A - 昂贵的聘礼 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1062 Appoint description: System Crawler (2016-05-06) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了

昂贵的聘礼(dijkstra)

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38549   Accepted: 11158 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

POJ1062 昂贵的聘礼 【DFS】

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币.便请求酋长减少要求.酋长说:"嗯,假设你能够替我弄到大祭司的皮袄,我能够仅仅要8000金币.假设你能够弄来他的水晶球,那么仅仅要50

poj1062——昂贵的聘礼(dijkstra变形)

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求

昂贵的聘礼 Dijkstra法

poj 1062 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39437   Accepted: 11432 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5