SPFA就过了一个点求助
查看原帖
SPFA就过了一个点求助
433642
m泛函625楼主2022/5/1 14:40
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 505,M=250005;
int h[N], e[M], ne[M], w[M], idx;
char g[N][N];
int s,t;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int dist[N],st[N];
void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void SPFA() {
	memset(dist, 0x3f, sizeof dist);
	memset(st, 0, sizeof st);
	queue<int> q;
	q.push(s);
	st[s] = 1;
	dist[s] = 0;
	while (!q.empty()) {
		int v = q.front();
		q.pop();
		st[v] = 0;
		for (int i = h[v]; ~i; i = ne[i]) {
			int t = e[i];
			if (dist[t] > dist[v] + w[i]) {
				dist[t] = dist[v] + w[i];
				if (!st[t]) {
					q.push(t);
					st[t] = 1;
				}
			}
		}
	}
}
int main() {
	int n, m;
	while (cin >> n >> m) {
		if (!n && !m)break;
		memset(g, 0, sizeof g);
		memset(h, -1, sizeof h);
		idx = 0;
		for (int i = 0; i < n; ++i)
			for (int j = 0; j < m; ++j)
				cin >> g[i][j];
		int sx, sy, ex, ey;
		cin >> sx >> sy >> ex >> ey;
		for (int i = 0; i < n; ++i)
			for (int j = 0; j < m; ++j) {
				for (int k = 0; k < 4; ++k) {
					int nx = i + dx[k], ny = j + dy[k];
					if (nx < 0 || nx >= n || ny < 0 || ny >= m)continue;
					if (g[nx][ny] != g[i][j]) {
						add(nx * m + ny, i * m + j, 1);
					}
					else {
						add(nx * m + ny, i * m + j, 0);
					}
				}
			}
		int s = sx * m + sy, t = ex * m + ey;
		SPFA();
		cout << dist[t]<<endl;
	}
}

就过了第一个点,第二个WA,后两个RE。。233

2022/5/1 14:40
加载中...