POJ 1062 昂贵的聘礼

来源:互联网 发布:时间矩阵图 编辑:程序博客网 时间:2024/05/22 08:20

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

/*题意:输入M,N分别表示地位等级差距限制和物品的总数。接下 输入 P L X 表示物品价格,主人等级,替代物品数目替代物品:T,V表示 替代物品编号和优惠价格M NP1 L1 X1T1 V1P2 L2 X2T2 V2输出最少需要的金币数。那么 在求最短路径时 需要保证  level[i]在 L1-M,L1+M之间那么 在求最短路径时 需要保证  level[i]在 L1-M,L1+M之间那么 在求最短路径时 需要保证  level[i]在 L1-M,L1+M之间思路:G[i][j] i表示替代物品编号,j表示物品的编号相当于:物品为j的 所要求的替代物品编号是0.. i...比如 10000 3 2G[2][3]=8000G[3][2]=5000;其余值为INF表示不能达到G[i][j]的值是 金币数抽象成:对于一个有向图:G[I][J] 表示起点i到终点j的权值是G[I][J]现在表示的含义是:j替代物品 代替 了 物品 i 所需的金币数目是G[i][j]原来dis[i]代表 起点到达i的最短路径是dis[i]现在dis[i]代表     物品i被替代所需的最少金币数起点为0 终点为1  因为有限制条件:等级需要在 L1-M,L1+M之间用level数组存  level[i]表示拥有物品i的人物等级是level[i]那么 在求最短路径时 需要保证  level[i]在 L1-M,L1+M之间                                                                */#include<cstdio>#define INF 1000000000const int N=112;int G[N][N],dis[N];int level[N];void dijkstra(int l,int r,int n){    int i,pos=0,j,min;    bool vis[N]={0};    for(int i=0;i<=n;++i) dis[i]=INF;    for(int i=1;i<=n;++i) if(level[i]>=l&&level[i]<=r)        dis[i]=G[pos][i];    vis[pos]=true;    for(i=1;i<n;++i)    {        for(j=1,min=INF;j<=n;++j)        {            if(level[j]>=l&&level[j]<=r&&!vis[j]&&dis[j]<min)            {                min=dis[j];                pos=j;            }        }            vis[pos]=true;            for(j=1;j<=n;++j)if(!vis[j]&&level[j]>=l&&level[j]<=r){                if(dis[j]>G[pos][j]+dis[pos]){                    dis[j]=G[pos][j]+dis[pos];                }            }        }}int main(){    int limit_level,total;    int cnt;    int ans=INF;    int index,t_money;    while(~scanf("%d %d",&limit_level,&total)){        for(int i=0;i<=total;++i)            for(int j=0;j<=total;++j) G[i][j]=INF;        for(int k=1;k<=total;++k)        {                scanf("%d %d %d",&G[0][k],&level[k],&cnt);                for(int i=0;i<cnt;++i)                {                    scanf("%d %d",&index,&t_money);                    G[index][k]=t_money;// why is not G[k][index]?                }        }        for(int i=level[1]-limit_level;i<=level[1];++i)        {                dijkstra(i,i+limit_level,total);                if(ans>dis[1])                    ans=dis[1];        }        printf("%d\n",ans);    }}


0 0