求大佬寻找 Dijkstra 有没有什么问题
  • 板块学术版
  • 楼主liyixin0514
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/14 21:37
  • 上次更新2024/10/14 22:01:03
查看原帖
求大佬寻找 Dijkstra 有没有什么问题
542128
liyixin0514楼主2024/10/14 21:37

rt。做某一道题目的时候查出来最短路部分算大了,但是眼瞎的蒟蒻看不出来有什么问题。99% 的概率问题出自以下代码,求大佬看看有什么问题orzorz

二维平面求最左边一列任意位置出发,走到最右边一列任意位置的最短路。val0/1/2/3val_{0/1/2/3} 是点向四个方向走的边权。已知不存在爆 long long 和数组没开够问题。

int mndis;
int dis[N][N];
struct node {
	int x,y;
	bool operator < (const node b) const { return dis[x][y] > dis[b.x][b.y] ; }
	bool operator == (const node b) const { return x==b.x && y==b.y ; }
};
const int inf = 0x3f3f3f3f;
void _min (int & x, int y) { x=min(x,y); }
const int dr[4][2] = { {1,0}, {-1,0}, {0,1}, {0,-1} };
void getdis () {
	priority_queue<node> que;
	memset(dis,0x3f,sizeof(dis));
	rep(i,1,n) dis[i][1]=0;
	rep(i,1,n) que.push({i,1});
	while(!que.empty()) {
		node u=que.top();
		// pf("%d %d\n",u.x,u.y);
		que.pop();
		if(vi[u.x][u.y]) continue;
		vi[u.x][u.y]=1;
		rep(j,0,3) {
			node v={u.x+dr[j][0], u.y+dr[j][1]};
			if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m) {
				if(dis[u.x][u.y] + val[j][u.x][u.y] < dis[v.x][v.y]) que.push(v);
				_min(dis[v.x][v.y],dis[u.x][u.y] + val[j][u.x][u.y]);
			}
		}
	}
	mndis=inf;
	rep(i,1,n) _min(mndis, dis[i][m]); 
}
2024/10/14 21:37
加载中...