昂贵的聘礼(最短路+建图)

编程入门 行业动态 更新时间:2024-10-18 08:25:37

昂贵的<a href=https://www.elefans.com/category/jswz/34/1716560.html style=聘礼(最短路+建图)"/>

昂贵的聘礼(最短路+建图)

昂贵的聘礼

 

                                            Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%lld & %llu


 

Description

年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。

Input

输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

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

这道题我记得刚开始放给我们的时候我就不会做。如今再一看发现很简单嘛!

题意就不赘述了。首先呢,要学会建图:

 

然后呢,就是要枚举等级。(就是假设他就是最小等级),然后每一个作为最小等级跑一遍最短路。

n也不大,才到100.

这道题由于有N个物品,我们就可以把它们看作是N个点,从其他点到他的优惠关系视做边,又因为最后总是要找到物品1,所以可以看作是从起点0,到将物品1作为终点的最小路径。然后由于题目是说,这条路劲上不能有两个的等级差超过M,所以我们可以枚举最小等级,将每个点的级数视作最小等级,每次都进行一次dijkstra算法,这样的话就不会掉解。


又由于我们是枚举的最小等级,所以源点0到其他每个点的边的权值就要赋值为那个点的价格,则等级比最小等级小的,或者等级减去最小等级比M大的其他点标记为不合法(也就是不可以走),然后在从合法的路径中找出最小花费。

参考:=copy

代码:

#include <stdio.h>
#include <string.h>
#define INF  0x3f3f3f3f
int n,m;
int map[105][105];
int dis[105];
int money[105];
int level[105];
int minLevel;
int vis[105];
void Init()       //初始化
{int i,j;for(i=0;i<=n;i++){for(j=0;j<=n;j++){if(i==j)map[i][j]=0;else map[i][j]=INF;}}
}
void Dij()
{int i,j;for(i=0;i<n;i++){int min=INF;int u=-1;for(j=1;j<=n;j++){if(level[j]<minLevel)continue;if(level[j]-minLevel>m)continue;     //等级不符合条件if(dis[j]<min&&!vis[j]){min=dis[j];u=j;}}if(u==-1)break;vis[u]=1;for(j=1;j<=n;j++){if(level[j]<minLevel)continue;if(level[j]-minLevel>m)continue;     //等级不符合条件if(!vis[j]&&dis[j]>dis[u]+map[u][j]) dis[j]=dis[u]+map[u][j];}}
}
int main()
{int i,j;while(scanf("%d %d",&m,&n)!=EOF){Init();for(i=1;i<=n;i++){int a;scanf("%d %d %d",&money[i],&level[i],&a);for(j=0;j<a;j++){int b,c;scanf("%d%d",&b,&c);map[b][i]=c;}map[0][i]=money[i];}int ans=INF;for(i=1;i<=n;i++)           //枚举最小等级{minLevel=level[i];for(j=1;j<=n;j++)dis[j]=map[0][j];dis[0]=0;memset(vis,0,sizeof(vis));vis[0]=1;Dij();if(ans>dis[1])ans=dis[1];}printf("%d\n",ans);}return 0;
}

 

更多推荐

昂贵的聘礼(最短路+建图)

本文发布于:2024-03-07 02:06:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1716558.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:聘礼   昂贵   建图

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!