nyoj 昂贵的聘礼(Dijkstra)

思路: 建图!!! 之后枚举最大等级,求到物品1的最短路。

 1
 2 #include <stdio.h>
 3 #include <queue>
 4 #include <string.h>
 5 #define maxn 0x3ffffff
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 int visit[110],dis[110],map[110][110],n,m,v,l,p,x,t,vis[110],liv[110],sb,w,cas;
 9 priority_queue<pii,vector<pii>,greater<pii> >qq;
10 int main()
11 {
12     int i,j,max;
13     while(scanf("%d%d",&m,&n)){
14         if(n==0&&m==0)
15             break;
16     memset(liv,0,sizeof(liv));
17     memset(map,9,sizeof(map));
18     sb=1;
19     max=0;
20     int sbsbsb=n;
21     while(sbsbsb--)
22     {
23         scanf("%d%d%d",&p,&l,&x);
24         map[0][sb]=p;
25         liv[sb]=l;
26         if(liv[sb]>max)
27             max=liv[sb];
28         for(i=1;i<=x;i++)
29         {
30             scanf("%d%d",&t,&v);
31             map[t][sb]=v;
32         }
33         sb++;
34     }
35     int min=maxn;
36     for(i=0;i<=max;i++)
37     {
38         memset(visit,0,sizeof(visit));
39         memset(dis,9,sizeof(dis));
40         dis[0]=0;
41         qq.push(make_pair(dis[0],0));
42         while(!qq.empty())
43         {
44             pii u=qq.top();
45             qq.pop();
46             int x=u.second;
47             if(visit[x])
48                 continue;
49             visit[x]=1;
50             for(j=0;j<=n;j++)
51             {
52                 if(liv[j]>=(i-m)&&liv[j]<=i)
53                 {
54                     if(dis[j]>(dis[x]+map[x][j]))
55                     {
56                         dis[j]=dis[x]+map[x][j];
57                         qq.push(make_pair(dis[j],j));
58                     }
59                 }
60             }
61         }
62         if(dis[1]<min)
63             min=dis[1];
64     }
65     printf("%d\n",min);
66     }
67     return 0;
68 }        

标程

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#include<climits>
#include<string.h>
#include<cmath>
#include<stdlib.h>
#include<vector>
#include<set>
#define INF 1e7
#define MAXN 100010
#define maxn 111
#define maxm 1000
#define Mod 1000007
#define MIN(a,b) (a < b ? a : b)
#define MAX(a,b) (a > b ? a : b)
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long LL;

int n, m, p, l, x;
int G[111][111], price[111], level[111];
int vis[111], dis[111];
int ans, k, t, v;

void init()
{
    memset(price,0,sizeof(price));
    memset(level,0,sizeof(level));
    for (int i = 0; i <= m; ++i)
        for (int j = 0; j <= m; ++j) {
            G[i][j] = INF;
        }
}

int Dijkstra()
{
    int pos, min;
    for (int i = 1; i <= m; ++i) dis[i] = price[i];
    for (int i = 1; i <= m; ++i) {
        min = INF;
        for (int j = 1; j <= m; ++j) {
            if (!vis[j] && min > dis[j]) {
                pos = j;
                min = dis[j];
            }
        }
        vis[pos] = 1;
        for (int j = 1; j <= m; ++j)
            if (!vis[j] && dis[pos] + G[pos][j] < dis[j])
                dis[j] = dis[pos] + G[pos][j];
    }

    return ans = MIN(ans,dis[1]);
}

void deal()
{
    ans = INF;
    for (int i = 1; i <= m; ++i) {
        int tmp = level[i];
        for (int j = 1; j <= m; ++j) {
            if (level[j] - tmp > n || tmp > level[j]) vis[j] = 1;
            else vis[j] = 0;
        }
        Dijkstra();
    }
    printf("%d\n",ans);
}

void read()
{
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &price[i], &level[i], &k);
        for (int j = 0; j < k; ++j) {
            scanf("%d%d", &t, &v);
            G[t][i] = v;
        }
    }
}
void run()
{
    init();
    read();
    deal();
}

int main()
{
    while (~scanf("%d%d", &n, &m),n+m)
        run();
    return 0;
}
时间: 2024-08-09 20:24:46

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

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金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出

昂贵的聘礼(dijkstra)

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

昂贵的聘礼 Dijkstra法

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

POJ1062 昂贵的聘礼 Dijkstra+枚举

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

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 路径上的物品互相替换后得

nyoj 510 昂贵的聘礼

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

poj 1062 昂贵的聘礼 (dijkstra最短路)

题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36799   Accepted: 10616 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的

POJ - 1062 昂贵的聘礼(最短路Dijkstra)

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