| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 40960 | Accepted: 11927 |
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
题目大意:
一个人为了娶酋长的13岁的女儿(雾),需要支付给酋长一定的钱,但是酋长提出如果他能买来另外某个人的东西,酋长会给予他一定的优惠(如起初酋长要求10000金币,但是酋长说:“如果你能买来2号的东西,我就只要求你付8000金币”,而2号的东西只需要1000金币,所以可以只花费9000金币)。但是题目限制了整个交易过程中的等级,假如你与一个等级过高的人交易过,那么你之后就不能与某些等级过低的人交易。注意:等级差距限制是对于整个交易过程而言的,不是对于每次交易。如:等级差距限制是2,那么如果之前与等级为4的人交易过,那么你就不能再与等级为1的人交易。参考代码:
#include<stack>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const double eps=1e-10;
const int INF=0x3f3f3f3f;
const int maxn=120;
struct people
{
int p,l,v,num[maxn],val[maxn];
}people[maxn];
int m,n;
int edge[maxn][maxn],mincost[maxn];
bool used[maxn];
void dijkstra(int x)
{
int level=people[x].l;
memset(mincost,INF,sizeof(mincost));
memset(used,false,sizeof(used));
for(int i=1;i<=n;i++)
edge[0][i]=people[i].p;
for(int i=0; i<=n; i++)
if(people[i].l-level<=m&&people[i].l>=level)//如果能够交易,即二者等级差的绝对值小于等于M
mincost[i]=edge[0][i];
used[0]=true;
while(true)
{
int v=-1;
for(int i=0; i<=n; i++)
if(!used[i]&&(v==-1||mincost[i]<mincost[v]))
v=i;
if(v==-1)
break;
used[v]=true;
for(int i=0; i<=n; i++)
if(people[i].l<=m+level&&people[i].l>=level)//如果能够交易才可以更新代价
if(mincost[i]>mincost[v]+edge[v][i])
mincost[i]=mincost[v]+edge[v][i];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(people,0,sizeof(people));
memset(edge,INF,sizeof(edge));
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&people[i].p,&people[i].l,&people[i].v);
for(int j=0; j<people[i].v; j++)
scanf("%d%d",&people[i].num[j],&people[i].val[j]);
}
for(int i=1; i<=n; i++)
for(int j=0; j<people[i].v; j++)
if(fabs(people[people[i].num[j]].l-people[i].l)<=m)
if (edge[people[i].num[j]][i]>people[i].val[j])
edge[people[i].num[j]][i]=people[i].val[j];
int ans=INF;
for (int i=1; i<=n; i++)//遍历
{
dijkstra(i);
ans=min(ans,mincost[1]);
}
printf("%d\n", ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/noooooorth/article/details/47702019