ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ 1062昂贵的聘礼

2019-11-13 19:03:54  阅读:252  来源: 互联网

标签:memset const int 1062 down vis POJ 聘礼 dis


Dij

建立一个虚拟节点以建图.
那么虚拟节点到这些点的值就是初始购买值.
可替代物品直接建图即可,每次取min保证最小花费.
等级浮动只有100,直接从1号点的等级-m枚举,因为要保证能和1号点交换.

参考代码

#include<bits/stdc++.h>
#define re register
using namespace std;
typedef long long ll;
const double eps=1e-7;
const int INF=1e9;
const int N=105;
int n,m;
int x,y;
int cnt;
int tot;
int a,c;
int dis[N];
bool vis[N];
int level[N];
int Map[N][N];
inline int dij(int down,int up) {
    memset(dis,0x3f,sizeof dis);
    memset(vis,0,sizeof vis);
    dis[0]=0;
    for(int i=1; i<=n+1; ++i) {
        int now=-1;
        for(int j=0; j<=n; ++j) {
            if(!vis[j]&&(now==-1||dis[now]>dis[j])) now=j;
        }
        vis[now]=1;
        for(int j=1; j<=n; ++j) {
            if(level[j]>=down&&level[j]<=up)
                dis[j]=min(dis[j],dis[now]+Map[now][j]);
        }
    }
    return dis[1];
}
int main() {
    memset(Map,0x3f,sizeof Map);
    scanf("%d%d",&m,&n);
    for(int i=1; i<=n; ++i) {
        scanf("%d%d%d",&a,&level[i],&cnt);
        Map[0][i]=min(Map[0][i],a);
        while(cnt--) {
            scanf("%d%d",&x,&y);
            Map[x][i]=min(Map[x][i],y);
        }
    }
    int res=INF;
    for(int i=level[1]-m; i<=level[1]; ++i) res=min(res,dij(i,i+m));
    printf("%d",res);
}

标签:memset,const,int,1062,down,vis,POJ,聘礼,dis
来源: https://www.cnblogs.com/Fast-Bird/p/11851775.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有