zoukankan      html  css  js  c++  java
  • 阿里巴巴2019年提前批编程题解析

    题目

    *光明小学的小朋友们要举行一年一度的接力跑大赛了,但是小朋友们却遇到了一个难题:设计接力跑大赛的线路,你能帮助他们完成这项工作么?
    光明小学可以抽象成一张有N个节点的图,每两点间都有一条道路相连。光明小学的每个班都有M个学生,所以你要为他们设计出一条恰好经过M条边的路径。
    光明小学的小朋友们希望全盘考虑所有的因素,所以你需要把任意两点间经过M条边的最短路径的距离输出出来以供参考。*
    你需要设计这样一个函数:
    res[][] Solve( N, M, map[][]);
    注意:map必然是N * N的二维数组,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路全部是无向边,无自环)2 <= N <= 100, 2 <= M <= 1e6。要求时间复杂度控制在O(N^3*log(M))。
    map数组表示了一张稠密图,其中任意两个不同节点i,j间都有一条边,边的长度为map[i][j]。N表示其中的节点数。
    你要返回的数组也必然是一个N * N的二维数组,表示从i出发走到j,经过M条边的最短路径
    你的路径中应考虑包含重复边的情况。
    这个题目要求在30分钟内解决,臣妾做不到的说。先来看看题目解析。 
    

    解析

    
    #include <iostream>
    using namespace std;
    void Solve(int N, int M, int** map, int** res)
    {
    	for (int i = 0; i < N; i++)
    	{
    		int **E = new int*[N];
    		for (int j = 0; j < N; j++)
    			E[j] = new int[M];     //建立存放动态结果的矩阵  
    		for (int j = 0; j < N; j++)
    		if (i != j)
    			E[j][0] = map[i][j];
    		else
    			E[j][0] = 100000000;
    		for (int k = 1; k < M; k++)
    		for (int j = 0; j < N; j++)
    			E[j][k] = 100000000;
    		for (int k = 1; k < M; k++)
    		{
    			for (int j = 0; j < N; j++)
    			{
    				for (int u = 0; u<N; u++)
    				{
    					if (u != j)
    					{
    						if (E[j][k]>E[u][k - 1] + map[u][j])
    							E[j][k] = E[u][k - 1] + map[u][j];
    					}
    				}
    			}
    		}
    		for (int j = 0; j < N; j++)
    			res[i][j] = E[j][M - 1];
    	}
    };
    int main()
    {
    	int N, M;   //输入N个结点,M个路径
    	//建立二维地图
    	int i, j;
    	//cout << "请输入结点数N,路径数M和地图Map:";
    	cin >> N;
    	cin >> M;
    	int row, col;
    	cin >> row >> col;
    	int **map = new int*[N];
    	int **res = new int*[N];
    	for (i = 0; i < N; i++)
    	{
    		map[i] = new int[N];
    		res[i] = new int[N];
    	}
    	for (i = 0; i < N; i++)
    	for (j = 0; j < N; j++)
    		cin >> map[i][j];
    	for (i = 0; i < N; i++)
    	for (j = 0; j < N; j++)
    		res[i][j] = 100000000;
    	Solve(N, M, map, res);
    	for (i = 0; i < N; i++)
    	{
    		for (int j = 0; j < N; j++)
    			cout << res[i][j] << "  ";
    		cout << endl;
    	}
    
    	for (i = 0; i < N; i++)
    		delete[] res[i];
    	delete[] res;
    	return 0;
    }
    
    
  • 相关阅读:
    LINUX的LAMP环境搭配
    Jquery添加元素append及阻止表单提交submit
    django上传文件
    Html5本地存储LocalStorage
    Html5离线缓存详细讲解
    html5的canvas绘制迷宫地图
    EXT.NET复杂布局(二)——报表
    Silverlight——施工计划日报表(一)
    Silverlight——施工计划日报表(二)
    前端学HTTP之网络基础
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9501709.html
Copyright © 2011-2022 走看看