rt。做某一道题目的时候查出来最短路部分算大了,但是眼瞎的蒟蒻看不出来有什么问题。99% 的概率问题出自以下代码,求大佬看看有什么问题orzorz
二维平面求最左边一列任意位置出发,走到最右边一列任意位置的最短路。val0/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]);
}