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);
}
posted @ 2019-11-13 18:53  贰冬  阅读(119)  评论(0编辑  收藏  举报