热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图论入门基础教程

图论是计算机科学和数学中的重要分支,本教程旨在为初学者提供全面的基础知识。通过实例解析,如“昂贵的聘礼”问题,讲述了一个年轻探险家在印第安部落与酋长女儿的爱情故事,展示了图论在解决实际问题中的应用。教程内容涵盖了图的基本概念、表示方法以及常见算法,适合各类读者学习。

图论很重要

 

题目:https://vjudge.net/contest/198762#problem/A

A - 昂贵的聘礼

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

题目意思&#xff1a;

    按例子讲&#xff1a;
输入1和4    分别是1个等级差距限制和4个物品&#xff08;相当与主人数&#xff09;&#xff0c;

输入 10000 3 2分别是    10000的价值的物品    3的主人等级   主人提出的两个物品兑换

输入 2 8000      分别是      2号物品&#xff08;主人&#xff09;  &#43;   8000金币数 才能兑换

输入 3 5000    同上

输入1000  2  1   分别是     1000的价值的物品    2的主人等级   主人提出的两个物品兑换

。。。。。。。

5250的得出      从第一个主人开始 &#xff1a; 兑换3号物品&#43;5000  

                        然后 从3号主人开始 &#xff1a; 兑换4号物品&#43;200

                         再然后从4号主人开始 &#xff1a;没有兑换的物品只能付50金币买物品

           所付金币就为   5000&#43;200&#43;50&#61;5250

题解&#xff1a;

 

 

 

dijkstra&#xff08;迪杰斯特拉&#xff09;算法遍历图求最短路&#43;等级制度的处理

dijkstra&#xff08;迪杰斯特拉&#xff09;算法&#xff1a;https://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html&#xff08;里面动态图挺容易懂的&#xff09;

AC代码&#xff1a;&#xff08;网上抄的&#xff09;

#include
#include
#include
using namespace std;

#define INF 0x3f3f3f3f
int mp[1100][1100];
int gg[11000];
int vis[11000];
int dis[11000];
int m,n;

int dijkstra()
{
int i,j;
memset(dis,0,sizeof(dis));
for(i&#61;1; i<&#61;n; i&#43;&#43;)//将从每一个点出发所需要的金币看做0到该点所需要的金币数目
dis[i]&#61;mp[0][i];
for(i&#61;1; i {
int mina&#61;INF;
int u,k;
for(j&#61;1; j<&#61;n; j&#43;&#43;)
{
if(!vis[j] && dis[j] {
mina&#61;dis[j];
u&#61;j;
}
}
vis[u]&#61;1;
for(k&#61;1; k<&#61;n; k&#43;&#43;)
{
if(!vis[k] && mp[u][k]dis[u]&#43;mp[u][k])
dis[k]&#61;dis[u]&#43;mp[u][k];
}
}
return dis[1];//返回每一个点到酋长处所花费的钱数
}

int main()
{
while(~scanf("%d%d",&m,&n))
{
int i,j,a,b,c,e,r;
for(i&#61;0; i<&#61;n; i&#43;&#43;)//初始胡为不能相通
for(j&#61;0; j<&#61;n; j&#43;&#43;)
mp[i][j]&#61;INF;
for(i&#61;1; i<&#61;n; i&#43;&#43;)
{
scanf("%d%d%d",&a,&b,&c);
mp[0][i]&#61;a;//将从每一个点出发所需要的金币看做0到该点所需要的金币数目
gg[i]&#61;b;
for(j&#61;1; j<&#61;c; j&#43;&#43;)
{
scanf("%d%d",&e,&r);
mp[e][i]&#61;r;//单向路径&#xff0c;且等级e低于i&#xff0c;低等级通向高等级
}
}
int minn&#61;INF;
for(i&#61;1; i<&#61;n; i&#43;&#43;)//枚举每一个人为最低等级
{
int mnn&#61;gg[i];
memset(vis,0,sizeof(vis));//注意初始化
for(j&#61;1; j<&#61;n; j&#43;&#43;)//标记等级差距过大&#xff0c;和等级低于自己的人
{
if(gg[j]m)
vis[j]&#61;1;
else
vis[j]&#61;0;
}
int ss&#61;dijkstra();
minn&#61;min(minn,ss);
}
printf("%d\n",minn);
}
return 0;
}

 

转:https://www.cnblogs.com/huangzzz/p/7868429.html



推荐阅读
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文将探讨Java编程语言中对象和类的核心概念,帮助读者更好地理解和应用面向对象编程的思想。通过实际例子和代码演示,我们将揭示如何在Java中定义、创建和使用对象。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • 解决SVN图标显示异常问题的综合指南
    本文详细探讨了SVN图标无法正常显示的问题,并提供了多种有效的解决方案,涵盖不同环境下的具体操作步骤。通过本文,您将了解如何排查和修复这些常见的SVN图标显示故障。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 本题要求实现一个函数,用于检查给定的字符串是否为回文。回文是指正向和反向读取都相同的字符串。例如,“XYZYX”和“xyzzyx”都是回文。 ... [详细]
author-avatar
推球了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有