热门标签 | 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



推荐阅读
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
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社区 版权所有