HDU - 2544 - 最短路
Dijkstra最短路算法
题目
解法
依旧是用的Dijkstra的模版,不过刚开始Wa了,应该是数组开小了吧。
// 2544 - 最短路
const int INF = 0x3f3f3f3f;
const int maxn = 105;
int N, M;
int road[maxn][maxn];
int d[maxn] = {INF};
bool used[maxn];
void dijkstra() {
fill(d, d + N, INF);
fill(used, used + N, false);
d[1] = 0;
for (; ; ) {
int v = -1;
for (int u = 1; u <= N; u++) {
if (!used[u] && (v == -1 || d[u] < d[v])) {
v = u;
}
}
if (v == -1) {
break;
}
used[v] = true;
for (int u = 1; u <= N; u++) {
d[u] = min(d[u], d[v] + road[v][u]);
}
}
}
void solve() {
dijkstra();
printf("%d\n", d[N]);
}
int main() {
int A, B, C;
while (~scanf("%d%d", &N, &M)) {
if (N == 0 && M == 0) {
break;
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= i; j++) {
road[i][j] = road[j][i] = INF;
}
}
while (M--) {
scanf("%d%d%d", &A, &B, &C);
road[A][B] = road[B][A] = C;
}
solve();
}
return 0;
}
Ac代码
// 2544 - 最短路
// Dijkstra
const int INF = 0x3f3f3f3f;
const int maxn = 1001;
int edge[maxn][maxn];
int d[maxn];
bool used[maxn];
int N, M;
void dijkstra() {
fill(d, d + maxn, INF);
fill(used, used + maxn, false);
d[1] = 0;
for (; ; ) {
int v = -1;
for (int u = 1; u <= N; u++) {
if (!used[u] && (v == -1 || d[u] < d[v])) {
v = u;
}
}
if (v == -1) {
break;
}
used[v] = true;
for (int u = 1; u <= N; u++) {
d[u] = min(d[u], d[v] + edge[v][u]);
}
}
}
int main() {
int from, to, cost;
while (~scanf("%d%d", &N, &M)) {
if (N == 0 && M == 0) {
break;
} else {
for (int i = 1; i <= N; i++) {
for (int j = 1; j < i; j++) {
edge[i][j] = edge[j][i] = INF;
}
}
for (int i = 1; i <= N; i++) {
edge[i][i] = 0;
}
while (M--) {
scanf("%d%d%d", &from, &to, &cost);
if (cost < edge[from][to]) {
edge[from][to] = edge[to][from] = cost;
}
}
dijkstra();
printf("%d\n", d[N]);
}
}
return 0;
}
总结
现在对数组范围大小还是没有一个清晰的概念,,,或许题做多了就知道了吧。。