当前位置: 首页 > article >正文

代码随想录算法训练营第六十二天 | 图论part11

97. 小明逛公园

#include <iostream>
#include <vector>
#include <climits>
#include <fstream>

using namespace std;

void floyd(vector<vector<vector<int>>>& grid) {
    int n = grid.size() - 1;
    for (int k = 1; k <= n; ++k) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                grid[i][j][k] = min(grid[i][j][k - 1],
                    grid[i][k][k - 1] + grid[k][j][k - 1]);
            }
        }
    }
}

int main() {
    ifstream infile("input.txt");
    int n, m;
    int u, v, w;
    cin >> n >> m;
    // grid[i][j][k]代表从i到j且只经过1-k作为中间节点的最小距离
    vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, 10005)));
    while (m--) {
        cin >> u >> v >> w;
        grid[u][v][0] = w;
        grid[v][u][0] = w;
    }
    floyd(grid);
    int q;
    cin >> q;
    int start, end;
    while (q--) {
        cin >> start >> end;
        if (grid[start][end][n] != 10005) cout << grid[start][end][n] << endl;
        else cout << -1 << endl;
    }
}

127. 骑士的攻击

#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

int dir[8][2] = { -2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2 };

struct Knight {
	int x, y;
	int f, g, h;
	Knight(){}
	Knight(int x, int y) : x(x), y(y) {}
	bool operator < (const Knight& k) const { return k.f < f;}
};

int Heuristic(Knight &k, int b1, int b2) {
	return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2);
}

int astar(Knight& start, int b1, int b2) {
	int moves[1001][1001] = { 0 };
	priority_queue<Knight> que;
	que.push(start);
	while (que.size()) {
		Knight k = que.top();
		Knight next;
		que.pop();
		if (k.x == b1 && k.y == b2) return moves[b1][b2];
		for (int i = 0; i < 8; ++i) {
			next.x = k.x + dir[i][0];
			next.y = k.y + dir[i][1];
			if (next.x < 1 || next.x > 1000 || next.y < 1 || next.y > 1000)
				continue;
			if (!moves[next.x][next.y])
			{
				moves[next.x][next.y] = moves[k.x][k.y] + 1;

				// 开始计算F
				next.g = k.g + 5; // 统一不开根号,这样可以提高精度,马走日,1 * 1 + 2 * 2 = 5
				next.h = Heuristic(next, b1, b2);
				next.f = next.g + next.h;
				que.push(next);
			}
		}
	}
	return -1;
}

int main() {
	ifstream infile("input.txt");
	int n;
	cin >> n;
	while (n--) {
		int a1, a2, b1, b2;
		cin >> a1 >> a2 >> b1 >> b2;
		Knight start(a1, a2);
		start.g = 0;
		start.h = Heuristic(start, b1, b2);
		start.f = start.g + start.h;
		cout << astar(start, b1, b2) << endl;
	}
	infile.close();
}

http://www.kler.cn/a/289201.html

相关文章:

  • 【Linux】-学习笔记03
  • SHELL脚本(Linux)
  • Python数据类型(一):bool布尔类型
  • Rust 所有权机制
  • 大数据技术之HBase中的HRegion
  • Autosar CP DDS规范导读
  • 51单片机-串口通信(单片机和PC互发数据)
  • Haskell爬虫:连接管理与HTTP请求性能
  • SprinBoot+Vue校园活动报名微信小程序的设计与实现
  • 【LeetCode】两数之和
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-ms-swift-单机单卡-V100(十二)
  • R3 天气预测
  • C++复习day01
  • Java中的双亲委派模型以及如何破坏双亲委派
  • JetBrains`s IntelliJ IDEA springboot项目 gradle-bin安装 国内加速
  • upload-labs闯关攻略
  • 代码随想录刷题day21丨669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树,二叉树总结
  • Java-通过Runnable接口实现多线程
  • DNS介绍(hosts文件,域名结构),面试题(输入url后会发生什么)
  • HTTP Tomcat相关知识
  • Notepad++的高级功能及插件使用说明(含安装包)
  • NIO笔记03-文件编程
  • JS实现高度不等的列表虚拟滚动加载
  • mysql迁移到达梦数据库报错:列[xx]长度超出定义
  • subclass-balancing的related work+conclusion
  • 智能合约漏洞(五)