P4667有一个点差8ms(不能用O2)
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n, m, cnt, sum;
int left_up, left_down, right_up, right_down;
char f[510];
int head[1100010], d[1100010];
struct edge {
int next, w, v;
} e[1100010];
inline void add(int u, int v, int w) {
e[++cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
struct node {
int u, d;
bool operator <(const node& num) const {
return d > num.d;
}
};
inline int read() {
int x = 0;
char s = getchar();
while (s >= '0' && s <= '9') {
x = x * 10 + s - '0';
s = getchar();
}
return x ;
}
inline void Dijkstra() {
sum = (m + 1) * (n + 1);
priority_queue<node> q;
for (register int i = 1; i <= sum; i++) {
d[i] = 0x7f7f7f;
}
d[1] = 0;
q.push({1, d[1]});
while (!q.empty()) {
node x = q.top();
q.pop();
int u = x.u;
if (x.d != d[u]) {
continue;
}
for (register int i = head[u]; i; i = e[i].next) {
int v = e[i].v, w = e[i].w;
if (d[u] + w < d[v]) {
d[v] = d[u] + w;
q.push({v, d[v]});
}
}
}
d[sum] == 0x7f7f7f ? printf("NO SOLUTION") : printf("%d", d[sum]);
}
int main() {
n = read(), m = read();
for (register int i = 0; i < n; i++) {
scanf("%s", f);
for (register int j = 0; j < m; j++) {
left_up = (m + 1) * i + j + 1;
right_up=(m + 1) * i + j + 2;
left_down = (m + 1) * (i + 1) + j + 1;
right_down = (m + 1) * (i + 1) + j + 2;
if (f[j] == 92) {
add(left_up, right_down, 0);
add(right_down, left_up, 0);
add(left_down, right_up, 1);
add(right_up, left_down ,1);
}
if (f[j] == 47) {
add(left_down, right_up, 0);
add(right_up, left_down, 0);
add(left_up, right_down, 1);
add(right_down, left_up, 1);
}
}
}
Dijkstra();
}