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

来源:互联网 发布:小孩编程软件 编辑:程序博客网 时间:2024/05/01 16:36
昂贵的聘礼

大意:中文题

思路:每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,则这两个节点之间有边,权值为金币数,求第一个节点到所有节点的最短路。因为有等级限制,所以枚举每个点作为最低等级,选取符合所有符合等级限制的点。

PS:参考的别人的博客,理解的不是很透彻,有些地方没想明白,后面还是要复习一下。


#include <stdio.h>#include <stdlib.h>#include <string.h>#define INF 0x7FFFFFFFint N, M;///物品i在有t号替代品的情况下的优惠价Map[i][t],当t=0时说明i无替代品,此时为原价int Map[110][110]; int dis[110]; ///最初的源点0到任意点i的最初距离(权值),相当于每个物品的原价int level[110];int x[110];bool vis[110];int Dijkstra(){    int p;    int Min_d;    for(int i = 1; i <= N; i++)    {        ///假设最初的源点就是0点,初始化最初源点到各点的权值dis[i]        dis[i] = Map[0][i];      }    for(int i = 1; i <= N; i++)    {        p = 0;        Min_d = INF;        for(int j = 1; j <= N; j++)        {            if(!vis[j] && Min_d >dis[j])            {                Min_d = dis[j];                p = j;            }        }        if(!p)        {            break;        }        vis[p] = true;        for(int j = 1; j <= N; j++)        {            ///把未访问但与新源点连通的点进行松弛             if(!vis[j] && Map[p][j] > 0 &&dis[j] > dis[p]+Map[p][j])            {                dis[j] = dis[p]+Map[p][j];            }        }    }    ///返回当前次交易后目标点1在等级level[i]约束下的最短距离    return dis[1];  }void Solve(){    memset(Map, 0, sizeof(Map));    memset(level, 0, sizeof(level));    memset(vis, false, sizeof(vis));    memset(dis, INF, sizeof(dis));    scanf("%d%d", &M, &N);    for(int i = 1; i <= N; i++)    {        ///Map[0][i]为物品i无替代品时的原价         scanf("%d%d%d", &Map[0][i], &level[i], &x[i]);        for(int j = 1; j <= x[i]; j++)        {            int t, u;            scanf("%d%d", &t, &u);            Map[t][i] = u;        }    }    int Max_level;    int Min_price = INF;    for(int i = 1; i <= N; i++)    {        Max_level = level[i];///把当前物品的等级暂时看做最高等级        for(int j = 1; j <= N; j++)        {            if(level[j] > Max_level || Max_level-level[j] > M)                vis[j] = true;            else                vis[j] = false;        }        int t = Dijkstra();        if(Min_price > t)            Min_price = t;    }    printf("%d\n", Min_price);}int main(){    Solve();    return 0;}



0 0
原创粉丝点击