题目地址:07-图4 哈利·波特的考试(25分)
求解过程:本文参考自MOOC,通过邻接矩阵和Floyd算法求解,主要分成以下几个模块
1. BuildGraph() 建立图
2. Floyd(Graph) 求两两之间的最短路径并直接在原图上更新
3. FindAnimal(Graph) 找最适合带的动物
另外还加入了show()方法,方便新手对中间矩阵变化过程进行查看
程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTIX 101
#define INFINITY 65536
typedef struct ENode* Edge;
struct ENode // 定义边结点
{
int weight;
int v1, v2;
};
typedef struct GNode* MGraph;
struct GNode
{
int Ne; // 边数
int Nv; // 顶点数
int G[MAXVERTIX][MAXVERTIX]; // 领接矩阵
};
MGraph CreateGraph(int VertixNum) // 初始化图
{
MGraph Graph = (MGraph)malloc(sizeof(GNode));
Graph->Nv = VertixNum;
Graph->Ne = 0;
for (int i = 0; i < VertixNum; i++)
for (int j = 0; j < VertixNum; j++)
{
if (i == j) // 对角元赋值为0
Graph->G[i][j] = 0;
else
Graph->G[i][j] = INFINITY;
}
return Graph;
}
void InsertEdge(MGraph Graph, Edge E)
{ /* 因为动物下标从1开始,矩阵下标从0开始 */
Graph->G[--E->v1][--E->v2] = E->weight;
Graph->G[E->v2][E->v1] = E->weight;
}
MGraph BuildGraph() // 插入边,建立图
{
int Nv;
scanf("%d", &Nv);
MGraph Graph = CreateGraph(Nv);
scanf("%d", &Graph->Ne);
Edge E = (Edge)malloc(sizeof(ENode));
if (Graph->Ne) // 如果存在边
for (int i = 0; i < Graph->Ne; i++)
{
scanf("%d %d %d", &E->v1, &E->v2, &E->weight);
InsertEdge(Graph, E);
}
return Graph;
}
void Floyd(MGraph Graph) // Floyd算法直接应用于原图
{
for (int k = 0; k < Graph->Nv; k++)
for (int i = 0; i < Graph->Nv; i++)
for (int j = 0; j < Graph->Nv; j++)
if (Graph->G[i][k] + Graph->G[k][j] < Graph->G[i][j])
Graph->G[i][j] = Graph->G[i][k] + Graph->G[k][j];
}
// void show(MGraph Graph) // 显示矩阵
// {
// for (int i = 0; i < Graph->Nv; i++)
// {
// for (int j = 0; j < Graph->Nv; j++)
// printf("%d ", Graph->G[i][j]);
// printf("\n");
// }
// }
void FindAnimal(MGraph Graph) // 寻找最合适的动物
{
int ID; // 保存动物ID
int MinMaxLen = INFINITY;
for (int i = 0; i < Graph->Nv; i++)
{ int MaxLen = 0; // 这个得放进循环里面
for (int j = 0; j < Graph->Nv; j++)
{ /* 如果i,j不连通说明带一只动物是不够的 */
if (Graph->G[i][j] == INFINITY)
{
printf("0\n");
return;
}
if (Graph->G[i][j] > MaxLen) // 找一行中最长的路径
MaxLen = Graph->G[i][j];
}
if (MaxLen < MinMaxLen) // 找所有最长路径中最短的路径
{
MinMaxLen = MaxLen;
ID = i+1;
}
}
printf("%d %d\n", ID, MinMaxLen);
}
int main(int argc, char const *argv[])
{
MGraph Graph = BuildGraph();
// show(Graph);
// printf("======================================\n");
Floyd(Graph);
// show(Graph);
FindAnimal(Graph);
return 0;
}