POJ - 1062 昂贵的聘礼(Dijkstra)

来源:互联网 发布:php curl 获取图片 编辑:程序博客网 时间:2024/05/17 02:58

题目链接:http://poj.org/problem?id=1062

#include <iostream>#include <string>#include <cstring>#include <cmath>#define N 105#define MAX 0x3f3f3f3fusing namespace std;/****************************************************************************************************************            题意:题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)                替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1            思路:            1,dijkstra算法            2,如何建图:                a,以每件物品和它的替代品建图(注意等级差必须在规定范围内)                b,以每个入度为0的点为起点,以第一个点(酋长的物品)为终点,搜索最短路                c,如何做到2呢?将所有点和一个新结点关联(程序中0为这个结点),初始化边为每个结点的花费            3,建图结束后基本上直接套板子就可以了,起点 = 0,终点 = 1,搜索找到最短边****************************************************************************************************************/struct Goods{    int p,l,v;    int num[N];    int val[N];}goods[N];int Map[N][N];int visit[N],dist[N];int m,n;int dijkstra(int st){    int leval=goods[st].l;    memset(dist,MAX,sizeof(dist));    memset(visit,0,sizeof(visit));    for(int i = 0;i <= n;i ++)        if(goods[i].l - leval <= m && goods[i].l >= leval)            dist[i]=Map[0][i];    dist[0]=0;    visit[0]=1;    for(int i = 0;i < n;i ++){        int id=MAX,ans=MAX;        for(int j = 0;j <= n;j ++)            if(!visit[j] && dist[j] < ans)                ans=dist[id=j];        if(id == MAX)   break;        visit[id]=1;        for(int j = 0;j <= n;j ++)            if(!visit[j] && goods[j].l - leval <= m && goods[j].l >= leval)                if(dist[j] > dist[id]+Map[id][j])                    dist[j]=dist[id]+Map[id][j];    }    return dist[1];}int main(){    while(cin>>m>>n)    {        memset(Map,MAX,sizeof(Map));        memset(goods,0,sizeof(goods));        for(int i = 1;i <= n;i ++){            cin>>goods[i].p>>goods[i].l>>goods[i].v;            for(int j = 0;j < goods[i].v;j ++)                cin>>goods[i].num[j]>>goods[i].val[j];            Map[0][i]=goods[i].p;       //建立新结点实现 2.c        }        for(int i = 1;i <= n;i ++)            for(int j = 0;j < goods[i].v;j ++)                if(fabs(goods[goods[i].num[j]].l - goods[i].l) <= m && goods[i].val[j] < Map[goods[i].num[j]][i])                    Map[goods[i].num[j]][i]=goods[i].val[j];        /*for(int i = 0;i <= n;i ++){            for(int j = 0;j <= n;j ++)                cout<<Map[i][j]<<"    ";            cout<<endl;        }*/        int ansN=MAX;        for(int i = 1;i <= n;i ++){     //搜索每种物品的替代品情况,找到花费最小的            int temp=dijkstra(i);            if(temp < ansN)                ansN=temp;        }        cout<<ansN<<endl;    }    return 0;}


0 0
原创粉丝点击