poj 1062 昂贵的聘礼

来源:互联网 发布:没有安全感 知乎 编辑:程序博客网 时间:2024/06/05 20:15

题目链接:

http://poj.org/problem?id=1062

这道题目不是自己独立做出来的,本来只是参考了部分题解,后来因为一些细节。。就把代码改的基本和题解一样了= =

说一下思路:题目的难点主要就是等级制度和替换。只要将这个等级制度处理好,题目就可以变形成一个裸的dijkstra。处理等级制度,参考题解用在了构图上,即用物品做点,价钱作为边长。然后用dijkstra代换,求出最短路,也就是最省钱的方案。

#include<iostream>#include<cstring>using namespace std;const int inf=0x7fffffff;int a[120][120]={};int lvl[120]={};int x[120]={};int dis[120];bool f[120]={};int n,m;int dijkstra(){    for(int i=1;i<=n;i++)    {        dis[i]=a[0][i];    }   // memset(f,0,sizeof(f));    //f[st]=1;dis[st]=0;    for(int i=1;i<n;i++)    {        int minn=inf,k=0;        for(int j=1;j<=n;j++)            if(!f[j]&&dis[j]<minn)            {                minn=dis[j];                k=j;            }        if(k==0)            break;        f[k]=1;        for(int j=1;j<=n;j++)        {            if(!f[j]&&a[k][j]>0&&dis[k]+a[k][j]<dis[j])                dis[j]=dis[k]+a[k][j];        }    }    return dis[1];}void init(){    memset(a,0,sizeof(a));    memset(lvl,0,sizeof(lvl));    memset(dis,inf,sizeof(dis));    memset(f,false,sizeof(f));    cin>>m>>n;    for(int i=1;i<=n;i++)    {        cin>>a[0][i]>>lvl[i]>>x[i];        for(int j=1;j<=x[i];j++)        {            int t1,t2;            cin>>t1>>t2;            a[t1][i]=t2;        }    }    int maxlv;    int tmoney;    int minmoney=inf;    for(int i=1;i<=n;i++)    {        maxlv=lvl[i];        for(int j=1;j<=n;j++)        {            if(lvl[j]>maxlv||maxlv-lvl[j]>m)            {                f[j]=1;            }            else f[j]=0;        }        tmoney=dijkstra();        if(minmoney>tmoney)            minmoney=tmoney;    }    cout<<minmoney<<endl;}int main(){    init();    //print();    return 0;}


0 0
原创粉丝点击