zoukankan      html  css  js  c++  java
  • POJ 1062昂贵的聘礼

    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);
    }
    
  • 相关阅读:
    【习题 8-9 1613】 K-Graph Oddity
    【习题 8-8 UVA
    【Hello 2018 D】Too Easy Problems
    【Hello 2018 C】Party Lemonade
    【Hello 2018 B】Christmas Spruce
    【Hello 2018 A】 Modular Exponentiation
    【习题 8-7 UVA
    【习题 8-6 UVA
    【习题 8-4 UVA
    【习题 8-3 UVA
  • 原文地址:https://www.cnblogs.com/Fast-Bird/p/11851775.html
Copyright © 2011-2022 走看看