您的位置:首页 > 其它

poj1062 昂贵的聘礼 dijkstra

2016-01-18 20:40 381 查看
题意:N件物品分别有自己的价值及地位,有些可以被另一件及一个优惠价来替换,选择出的任意两件之间的地位差不超过m,求第一件的最低价;

最开始想用dfs,无情的爆栈了;

强行构图,以每件的价值为点,替换的优惠价为边。遍历每一件物品,把当前物品作为的最低地位(关键),以此选择出符合的点和边,用dijkstra,选出当前情况下第一件物品的最低价,最终比较出所有情况下第一件物品的最低价;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 110
#define INF 0x7ffffff

using namespace std;

int d
,price
,pos
,v
,e

,n,m;

int dijkstra()
{
for(int i=1;i<=n;i++)
d[i]=price[i];
for(int i=0;i<n;i++)
{
int mmin=INF,t=-1;
for(int j=1;j<=n;j++)
if(!v[j]&&d[j]<mmin)
mmin=d[t=j];
if(t==-1)    break;
v[t]=1;
for(int j=1;j<n;j++)
if(!v[j]&&d[j]>d[t]+e[t][j])
d[j]=d[t]+e[t][j];
}
return d[1];
}

int main()
{
while(~scanf("%d%d",&m,&n))
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
e[i][j]=INF;//inti
for(int i=1;i<=n;i++)
{
int x;
scanf("%d%d%d",&price[i],&pos[i],&x);
for(int j=0;j<x;j++)
{
int val,t;
scanf("%d%d",&t,&val);
e[t][i]=val;
}
}
int _min=INF;
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
for(int j=1;j<=n;j++)
if(pos[j]<pos[i]||pos[j]-pos[i]>m)  v[j]=1;
_min=min(dijkstra(),_min);
}
cout<<_min<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: