题目链接:
http://poj.org/problem?id=1062
这道题目不是自己独立做出来的,本来只是参考了部分题解,后来因为一些细节。。就把代码改的基本和题解一样了= =
说一下思路:题目的难点主要就是等级制度和替换。只要将这个等级制度处理好,题目就可以变形成一个裸的dijkstra。处理等级制度,参考题解用在了构图上,即用物品做点,价钱作为边长。然后用dijkstra代换,求出最短路,也就是最省钱的方案。
#include<iostream>
#include<cstring>
using namespace std;
const int inf=0x7fffffff;
int a[120][120]={};
int lvl[120]={};
int x[120]={};
int dis[120];
bool f[120]={};
int n,m;
int dijkstra()
{
for(int i=1;i<=n;i++)
{
dis[i]=a[0][i];
}
// memset(f,0,sizeof(f));
//f[st]=1;dis[st]=0;
for(int i=1;i<n;i++)
{
int minn=inf,k=0;
for(int j=1;j<=n;j++)
if(!f[j]&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
if(k==0)
break;
f[k]=1;
for(int j=1;j<=n;j++)
{
if(!f[j]&&a[k][j]>0&&dis[k]+a[k][j]<dis[j])
dis[j]=dis[k]+a[k][j];
}
}
return dis[1];
}
void init()
{
memset(a,0,sizeof(a));
memset(lvl,0,sizeof(lvl));
memset(dis,inf,sizeof(dis));
memset(f,false,sizeof(f));
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>a[0][i]>>lvl[i]>>x[i];
for(int j=1;j<=x[i];j++)
{
int t1,t2;
cin>>t1>>t2;
a[t1][i]=t2;
}
}
int maxlv;
int tmoney;
int minmoney=inf;
for(int i=1;i<=n;i++)
{
maxlv=lvl[i];
for(int j=1;j<=n;j++)
{
if(lvl[j]>maxlv||maxlv-lvl[j]>m)
{
f[j]=1;
}
else f[j]=0;
}
tmoney=dijkstra();
if(minmoney>tmoney)
minmoney=tmoney;
}
cout<<minmoney<<endl;
}
int main()
{
init();
//print();
return 0;
}