求助,记忆化搜索。测试点1WA
查看原帖
求助,记忆化搜索。测试点1WA
598700
vanderboom楼主2022/7/15 20:18

上代码

#include<iostream>
#include<cmath>
using namespace std;
int n, m, sta, dst; const int maxn = 1 << 30;
int con[101][101];					//con[u][x]为与u连通的第n个点
float dis[101][101];
int px[101], py[101], vis[101];		//vis用于判断该点是否在solve的栈中
float val[101];						//px py val 分别为点的横 纵坐标  到目标的距离

void add(int a, int b) {		//添加边
	int dx = px[a] - px[b], dy = py[a] - py[b];
	float s = sqrt(dx * dx + dy * dy);
	con[a][++con[a][0]] = b;
	con[b][++con[b][0]] = a;
	dis[a][b] = dis[b][a] = s;
	return;
}
void read() {
	cin >> n;
	for (int i = 1; i <= n; i++)cin >> px[i] >> py[i];
	cin >> m; int a, b;
	for (int i = 0; i < m; i++) {
		cin >> a >> b;
		add(a, b);
	}
	cin >> sta >> dst; val[dst] = 1;		//val[x]==0被用于判断点未被计算出结果,这里把目标加一,输出时再减一
	return;
}
float solve(int x) {		
	if (val[x])return val[x];
	vis[x] = 1;
	float min = maxn, now; int p;
	for (int i = con[x][0]; i > 0; i--) {	//找到离目标最近的点
		p = con[x][i];
		if ((!val[p]) && vis[p])continue;	//防止循环
		now = dis[x][p] + solve(p);
		if (now < min)min = now;
	}
	if (min != maxn)val[x] = min;			//避免一个点因周围点在栈中导致被判不在与目标最短路上
	vis[x] = 0;
	return min;
}

void pt(int x) {							//调试用函数,打印到x的点及距离
	int p; cout << endl;
	for (int i = con[x][0]; i >= 0; i--) {
		p = con[x][i];
		cout << p << " #" << i << ' ' << dis[x][p] << "$  ";
	}
	return;
}

int main() {
	read();
	printf("%.2lf", solve(sta) - 1);
	return 0;
}

个人推测是路径有误(测试点1输出为九万多,无规律)

还望路过的大佬不吝赐教,不胜感激

2022/7/15 20:18
加载中...