POJ 1062(昂贵的聘礼 枚举 + Dijkstra)

来源:互联网 发布:剪裁证件照片的软件 编辑:程序博客网 时间:2024/06/12 13:47

POJ1062

这道题是中文题,不多说,但是问题是数据可能不易看懂,比如样例的10000 3 2 分别是原价,等级,和可能兑换物品的数量,接下来是两行可能兑换的物品及另需要的钱。


#include<iostream>#include<cstring>using namespace std;#define INF 0x3f3f3f3f#define Maxn 200int M,N;int price[Maxn][Maxn];      //price[i][j],从i到j所需要的钱int lv[Maxn];               //第i人的等级int num[Maxn];              //兑换i物所需要的数量int dist[Maxn];             //权int visit[Maxn];void input(){    memset(visit,0,sizeof(visit));    memset(price,0,sizeof(price));    memset(lv,0,sizeof(lv));    cin>>M>>N;    for(int i = 1;i <= N; i++){        cin>>price[0][i]>>lv[i]>>num[i];        for(int j = 1;j <= num[i]; j++){            int w,v;            cin>>w>>v;            price[w][i] = v;        }    }}int Dijkstra(){    int pos,min;    for(int i = 1;i <= N; i++)        dist[i] = price[0][i];    for(int i = 1;i <= N; i++){        min = INF;        pos = 0;        for(int j = 1;j <= N; j++){            if(!visit[j] && min > dist[j]){                min = dist[j];                pos = j;            }        }        visit[pos] = true;        if(pos == 0)            break;        for(int j = 1;j <= N; j++){            if(!visit[j] && price[pos][j] > 0 && dist[j] > dist[pos] + price[pos][j])                dist[j] = dist[pos] + price[pos][j];        }    }    return dist[1];}int main(){    input();    int lowprice = INF;;    int nowprice;    int mlv;    for(int i = 1;i <= N; i++){             //把每一个等级都当做能交易的最大等级算一遍        mlv = lv[i];        for(int j = 1;j <= N; j++)            if(lv[j] > mlv || mlv - lv[j] > M)                visit[j] = true;            else                visit[j] = false;        nowprice = Dijkstra();        if(lowprice > nowprice)            lowprice = nowprice;    }    cout<<lowprice<<endl;    return 0;}


0 0
原创粉丝点击