07-图4 哈利·波特的考试 (25 分)
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。

现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问你:带什么动物去可以让最难变的那种动物(即该动物变为哈利·波特自己带去的动物所需要的魔咒最长)需要的魔咒最短?例如:如果只有猫、鼠、鱼,则显然哈利·波特应该带鼠去,因为鼠变成另外两种动物都只需要念4个字符;而如果带猫去,则至少需要念6个字符才能把猫变成鱼;同理,带鱼去也不是最好的选择。

输入格式:
输入说明:输入第1行给出两个正整数N (≤100)和M,其中N是考试涉及的动物总数,M是用于直接变形的魔咒条数。为简单起见,我们将动物按1~N编号。随后M行,每行给出了3个正整数,分别是两种动物的编号、以及它们之间变形需要的魔咒的长度(≤100),数字之间用空格分隔。

输出格式:
输出哈利·波特应该带去考场的动物的编号、以及最长的变形魔咒的长度,中间以空格分隔。如果只带1只动物是不可能完成所有变形要求的,则输出0。如果有若干只动物都可以备选,则输出编号最小的那只。

输入样例:
6 11
3 4 70
1 2 1
5 4 50
2 6 50
5 6 60
1 3 70
4 6 60
3 6 80
5 1 100
2 4 60
5 2 80
结尾无空行

首先建立邻接矩阵,代码如下:

#include<iostream>
#include<cmath>
using namespace std;
const int INF = 32767;
const int MaxSize = 501;
typedef int ElemType;
//结点信息
typedef struct {int no;//顶点编号ElemType data;//其他信息
}VertexType;
typedef struct {int edges[MaxSize][MaxSize];int n, e;VertexType vexs[MaxSize];
}MatGraph;//邻接矩阵表达形式

这题显然是一道最短路径问题,
首先最短路径算法有两种
单源最短路径算法为Dijkstra算法




代码如下:

//Dijkstra算法描述,单源最短路径算法
void Dijkstra(MatGraph g, int v)
{int distanc[MaxSize], path[MaxSize];//分别记录v到各点的最短距离以及对应路径int S[MaxSize];//记录顶点是否被处理过,即是否已经用来更新最短路径s[i]=1则表示已经更新//把距离和路径初始化,与v邻接的点距离赋值为该条边的长度,不邻接的赋值为无穷//邻接点的路径path[i]=v,因为他的下一个顶点就是v,暂时的最短路径就是直接到v//非邻接点的路径path[i]=-1,表示没有返回的最短路径的相应点。for (int i = 0;i < g.n;++i){distanc[i] = g.edges[v][i];S[i] = 0;//表示暂时还没有顶点被处理过,不在S里面if (g.edges[v][i] < INF)path[i] = v;elsepath[i] = -1;}S[v] = 1;path[v] = 0;//这里path[v]=0是否不需要?,S[v]=1表示v在S里面了,v已经处理了int temp;//循环直到把所以点放入S中,得到最终最短路径for (int i = 0;i < g.n - 1;++i){int MINdis = INF;//把最短距离初始化为最大for (int j = 0;j < g.n;++j)//找出不在S中且距离v最近的顶点uif (S[j] == 0 && distanc[j] < MINdis){temp = j;MINdis = distanc[j];//这样不停置换就可以得到最小的distanc对应的temp}S[temp] = 1;//然后堆temp的邻接点进行操作,更新最短路径for(int j=0;j<g.n;++j)if (S[j] == 0)//表示没有被处理过的,可以用来更新的j点if (g.edges[temp][j] < INF && distanc[temp] + g.edges[temp][j] < distanc[j]){distanc[j] = distanc[temp] + g.edges[temp][j];path[j] = temp;//这里找到temp的邻接点,然后判断是否存在更短的路径,可以的话进行调换    }}//到这里所以点已经访问完毕,可以进行输出Dispath(g, distanc, path, S, v);
}
//最短路径输出函数
void Dispath(MatGraph g, int distanc[], int path[], int S[], int v)
{//输出从顶点v出发的所有最短路径int k,d,path1[MaxSize];for(int i=0;i<g.n;i++)if (S[i] == 1 && i != v){cout << "从顶点" << v << "到顶点" << i << "的最短路径为:" << distanc[i] << endl;d = 0;path1[d] = i;//把路径上最后一个点放在第一位,然后逆序输出;k = path[i];if (k == -1)cout << "无路径" << endl;//表示i点和v直接没有路径else{while (k != v)//在path中找到路径,并且将其放到path1中{++d;path1[d] = k;k = path[k];}++d;path1[d] = v;//把起始结点放到最后一位for (int j = d;j >= 0;--j)cout << path[j] << " ";//把路径结点倒序输出cout << endl;}}
}

多源最短路径算法如下:


代码如下:

//Floyd算法,多源最短路径算法,把每对顶点之间的最短路径算出来
void Floyd(MatGraph g)
{int distanc1[MaxSize][MaxSize], path[MaxSize][MaxSize];//首先初始化路径和距离for(int i=0;i<g.n;++i)for (int j = 0;j < g.n;++j){distanc1[i][j] = g.edges[i][j];if (i != j && g.edges[i][j] < INF)path[i][j] = i;elsepath[i][j] = -1;}//然后依次考察所以顶点for(int k=0;k<g.n;++k)for(int i=0;i<g.n;++i)for(int j=0;j<g.n;++j)if (distanc1[i][j] > distanc1[i][k] + distanc1[k][j]){distanc1[i][j] = distanc1[i][k] + distanc1[k][j];path[i][j] = path[k][j];//即在i,j之间插入了一个k,构成了另一条更短的最短路径,所以j的前一个元素变成k}Dispath1(g, distanc1, path);
}
//Floyd算法的输出
void Dispath1(MatGraph g, int distanc1[][MaxSize], int path[][MaxSize])
{int k,path1[MaxSize],d;//path1可以定义在外部,不需要每次循环之后更新//因为每一次循环输出时,会用到的path1[d]的值都会重新赋值,没有重新赋值的也不会用到//上面那个Dijkstra算法也是一样for(int i=0;i<g.n;++i)for (int j = 0;j < g.n;++j){if (distanc1[i][j] != INF && i != j)//若i与j之间存在路径{cout << "从" << i << "到" << j << "的路径为:";k = path[i][j];d = 0;path1[d] = j;//把终点放在路径数组首位,然后逆序输出while (d != -1 && k != i)//还有路径可走并且没有到达终点i{d++;path1[d] = k;k = path[i][k];}d++;path1[d] = i;for (int s = d;s >= 0;--s)cout << path1[s] << " ";cout << endl;cout << "路径长度为:" << distanc1[i][j] << endl;}}
}

改题目其实是floyd算法的一个变形,比较简单,但是要注意堆栈溢出,还有就是只输出一个动物,记得break;代码如下:

#include<iostream>
using namespace std;
const int INF = 65535;//这个数是int的最大值
const int MaxSize = 100;
int distanc1[MaxSize][MaxSize];
int path[MaxSize][MaxSize];//这些都应该定义在全局里面,才不会溢出
typedef int ElemType;
//结点信息
typedef struct {int no;//顶点编号ElemType data;//其他信息
}VertexType;
typedef struct {int edges[MaxSize][MaxSize];int n, e;VertexType vexs[MaxSize];
}MatGraph;//邻接矩阵表达形式
MatGraph g;//应该定义在全局,这样才不会堆栈溢出
//Floyd算法,多源最短路径算法,
void Dispath1()//这里不应该把path,distance1,还有g等参数放进去,因为放进去之后在主函数里面
//调用时还是会占有主函数堆栈的空间,到时候数据一大又会堆栈溢出
{int ans[MaxSize] = { 0 };for (int i = 0;i < g.n;++i)for (int j = 0;j < g.n;++j){if (ans[i] <= distanc1[i][j]){ans[i] = distanc1[i][j];}}int Min = INF;for (int i = 0;i < g.n;++i){if (Min > ans[i]){Min = ans[i];}}if (Min == INF)cout << "0" << endl;else{for (int j = 0;j < g.n;++j){if (ans[j] == Min){cout << j + 1 << " " << ans[j] << endl;break;//这一步忘记了的话后面两个测试点过不去}}}
}
void Floyd()//这里也是一样,不能有占空间较大的参数
{//首先初始化路径和距离for(int i=0;i<g.n;++i)for (int j = 0;j < g.n;++j){distanc1[i][j] = g.edges[i][j];if (i != j && g.edges[i][j] < INF)path[i][j] = i;elsepath[i][j] = -1;}//然后依次考察所以顶点for(int k=0;k<g.n;++k)for(int i=0;i<g.n;++i)for(int j=0;j<g.n;++j)if (distanc1[i][j] > distanc1[i][k] + distanc1[k][j]){distanc1[i][j] = distanc1[i][k] + distanc1[k][j];path[i][j] = path[k][j];//即在i,j之间插入了一个k,构成了另一条更短的最短路径,所以j的前一个元素变成k}Dispath1();
}
int main()
{int N, M;cin >> N >> M;g.n = N;g.e = M;for(int i=0;i<MaxSize;++i)for (int j = 0;j < MaxSize;++j){if (i == j)g.edges[i][j] = 0;elseg.edges[i][j] = INF;}int animal1, animal2, magic;for (int i = 0;i < M;++i){cin >> animal1 >> animal2 >> magic;g.edges[animal1-1][animal2-1] = magic;g.edges[animal2-1][animal1-1] = magic;}Floyd();
}

最短路径算法,Dijkstra算法,floyd算法 07-图4 哈利·波特的考试 (25 分)相关推荐

  1. 【floyd模板】哈利·波特的考试 (25 分)

    立志用最少的代码做最高效的表达 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔 ...

  2. 最短路径算法——Dijkstra and Floyd算法

    一.     前言:     这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...

  3. 两种最短路径(测地距离)的算法——Dijkstra和Floyd

    从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法 ...

  4. 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

    图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...

  5. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  6. 数据结构之图的应用:最短路径(Dijkstra、Floyd)

    图的应用:最短路径 思维导图: 最短路径的定义: BFS算法:(无权单源最短路径) Dijkstra算法:(无权单源.带权单源) Dijkstra算法原理: 算法实现中的辅助数组: 例: 如何通过pa ...

  7. 07-图4 哈利·波特的考试(Folyd算法,Dijkstra算法)

    07-图4 哈利·波特的考试 分数 25 作者 陈越 单位 浙江大学 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成 ...

  8. 数据结构与算法A实验六图论---7-2 哈利·波特的考试(Flody算法)

    哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念 ...

  9. 7-8 哈利·波特的考试(Floyd)

    题目链接:7-8 哈利·波特的考试 考查知识:Floyd 题意描述:给定n个动物,m条咒语,问最难变的那种动物需要的魔咒最短. 思路简析: 动物即地点,一个动物变为另一个动物的魔咒长度即距离,最难变的 ...

  10. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

最新文章

  1. OPENWRT中SSH免密钥登陆(具体步骤)
  2. 问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
  3. easyui treegrid php,easyUI TreeGrid
  4. leetcode算法题--矩阵区域和
  5. 在Docker容器中的Tomcat上运行ADF Essentials
  6. python 进程与线程(理论部分)
  7. 闲鱼对Flutter-Native混合工程解耦的探索
  8. Visual Paradigm(一)简介和软件初步
  9. maven项目依赖被改为文件夹时如何改回lib
  10. ThinkPad T61 X61安装XP系统的方法及xp驅動下載
  11. 【初识 JQMobile 小小总结】
  12. 阿里职位层级(附P级详细要求)
  13. 治疗骨髓增殖性肿瘤的一种新型高选择性酪氨酸激酶抑制剂ZT55的研究
  14. 遥感卫星不同光谱带介绍(Band 1 - Band 13)
  15. 文本 去除重复行(sublime Text3 ,正则表达式)
  16. 【原创+转贴】岁月不饶人,爸妈老了
  17. React最佳实践系列 —— 循序渐进理解 Dva中的model概念
  18. 信号实验:随机信号的产生和分析
  19. 云原生钻石课程 | 第2课:Kubernetes 技术架构深度剖析
  20. 叶绿体基因做跨物种系统发育分析

热门文章

  1. 视频教程-ASP.NET就业实例视频教程(1)基础入门——搭建网站开发环境教学视频-.NET
  2. 随便谈谈职场人对开会的看法和建议以及针对无聊会议的摆烂建议
  3. 变上限积分求导的原理
  4. ICE for Linux
  5. 大白教你一分钟识别图片中的文字
  6. mysql查询IP地址
  7. 数据结构课程设计(选):连连看
  8. ubuntu 18.04 gnome shift键失灵
  9. 【02】制作第一个zblog模板第二期,熟悉模板所有的开发运行和调试机制·提前做好所有纯html页面
  10. 在线版和离线版电路仿真以及开源电子硬件设计介绍