数据结构作业3-4(周)问题E:最短路

题目描述

给一张无向图G(U, E), 询问任意两点的最短距离。

输入

第一行两个整数n,m表示图中结点数和边的数量, 结点从1到n编号。
接下来m行,每行三个整数u,v,w表示u,v之间有一条距离为w的边。
接下来一行一个整数q,表示询问次数。
接下来q行每行两个整数u,v,表示询问u到v的最短距离, 如果u不能到达v输出-1。	
数据范围:n <= 100, m <= 5000, q <= 10000, 0 < w <= 1000。
输出对应输出q行答案。

样例输入

5 10
1 2 1
2 5 10
1 3 2
1 4 4
1 5 6
2 3 4
2 4 3
3 4 1
3 5 4
4 5 2
5
1 4
3 5
2 3
4 2
5 2

样例输出

3
3
3
3
5

我的TIPS:
在这里插入图片描述
这里简要的提及一下How to deal with it.第一步,先给定一个二维数组(虽然这玩意的标准说法是图的邻接矩阵),数组arr[x][y]的意思是从点x到点y,将对角线上的值都设为0(x到x的距离是0),其他值都设为无穷大(点x到另一个点y之间没有通路设为无穷大,那个0x3f3f3f3f的意思是无穷大),第二步,接着将题干中给的距离进入数组中重新更改。第三步,在比较中,最好的方法是从点x到点y直接有通路;但此时我们发现从点x到点z,再从点z到点y的距离比直接从点x到点y的距离短,那我们就重新更正点x到点y的距离,也就是数组arr[x][y]的值为arr[x][z]+arr[z][y],以此类推。

#include<iostream>
#include<cstring>
using namespace std;
const int temp=0x3f3f3f3f;
int arr[400][400];//这题在OJ系统里给的n的范围并不是0~100,坑死人了
int n,m;//n为点的个数,m为边的条数

int main()
{	while(cin>>n>>m)
 	{ 	for(int i=0;i<400;i++)//第一步,我们将整个二维数组的元素设置为无穷大或0 
  		{ 	for(int j=0;j<400;j++)
   			{ 	arr[i][j]=temp;
    				if(i==j){arr[i][j]=0;}
   			}
  		}
  	int a,b,c;
  	for(int i=1;i<=m;i++)//第二步,我们将测试用例中的边的数据进行记录 
        {   cin>>a>>b>>c;
            if(c<arr[a][b])
            {arr[a][b]=arr[b][a]=c;}
        } 
        for(int k=1;k<=n;k++)//第三步,弗洛伊德算法            
   		for(int i=1;i<=n;i++)                
    			for(int j=1;j<=n;j++)                    
     				if(arr[i][j]>arr[i][k]+arr[k][j]&&arr[i][k]<temp&&arr[k][j]<temp)
                        		arr[i][j]=arr[i][k]+arr[k][j];
	int q;
  	while(cin>>q&&q>=0)      
        { 	for(int i=1;i<=q;i++)
         	{
          		int x,y;
          		cin>>x>>y;
          		if(arr[x][y]>=temp)
          		{cout<<"-1"<<endl;}
    			else
    			{cout<<arr[x][y]<<endl;}
   		}
  	} 
 	}
 return 0;
} 

当代学子真是被压榨的对象,祝各位考研和保研顺利,早离开早好。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计你的学校的平面图,至少包括10个以上的景点(场所),每两个景点间可以有不同的路,且路长也可能不同,找出从任意景点到达另一景点的最佳路径(最短路径)。 要求: (1)以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。 (2)为来访客人提供图中任意景点相关信息的查询。 (3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。 (4)提供图的编辑功能:增加、修改、删除景点;增加、修改、删除道路等。 (5)校园导游图的仿真界面。 8.学生成绩管理系统 学生成绩管理是高等学校教务管理的重要组成部分,主要包括学生注册、考试成绩的录入及修改、成绩的统计分析等等。设计一个系统实现对学生成绩的管理。 要求系统应具有以下基本功能: (1)学生注册登记; (2)增加、删除某一班级的学生; (3)成绩录入:输入学生的考试成绩; 要求采用二叉排序树存放学生成绩,一门课程对应一棵二叉排序树; (4)成绩修改:若输入错误可进行修改; (5)统计分析:对某个班级学生的单科成绩进行统计,求出平均成绩;求出成绩处于指定分数段内的学生人数;求出每个学生一学期各科的平均成绩等; (6)查找:查找某个学生的某门课程成绩,查找某门课程成绩处于指定分数段内的学生名单等等。 (7)打印:打印一个班级学生的单科成绩;打印某一课程成绩处于指定分数段内的学生名单;打印学生在某一学期的成绩报告单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值