rt,蒟蒻调了半天也没调出来。。
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1342
蒟蒻的代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <memory.h>
using namespace std;
const int N = 1010, M = 5 * N;
int n, m, s, t, u, v;
int h[N], idx, vtx[M], nxt[M], vis[N], x[N], y[N];
double w[N], dis[N];
void addEdge(int a, int b, double c) {
int p = h[a], flag = 0;
while (p != -1) {
if (vtx[p] == b) {
flag = 1, w[p] = min(w[p], c);
}
p = nxt[p];
}
if (flag == 0) {
vtx[idx] = b, nxt[idx] = h[a], w[idx] = c, h[a] = idx++;
}
}
void dijkstra(int u) {
dis[u] = 0;
for (int k = 0; k < n; k++) {
int tmp = 1;
for (int i = 1; i <= n; i++) {
if (vis[i] == 0) {
tmp = i;
break;
}
}
for (int i = tmp + 1; i <= n; i++) {
if (vis[i] == 0 && dis[tmp] > dis[i]) tmp = i;
}
vis[tmp] = 1;
int p = h[tmp];
while (p != -1) {
if (dis[vtx[p]] > dis[tmp] + w[p]) {
dis[vtx[p]] = dis[tmp] + w[p];
// pre[vtx[p]] = tmp;
}
p = nxt[p];
}
}
}
int main() {
memset(h, -1, sizeof h);
memset(dis, 127, sizeof dis);
scanf("%d", &n);
// for (int i = 1; i <= n; i++) dis[i] = (2 << 30) - 1;
for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
double weight = sqrt((x[u] - x[v]) * (x[u] - x[v]) + (y[u] - y[v]) * (y[u] - y[v]));
// cout << weight << endl;
if (u != v) {
addEdge(u, v, weight);
addEdge(v, u, weight);
}
}
scanf("%d%d", &s, &t);
dijkstra(s);
printf("%.2lf\n", dis[t]);
return 0;
}
蒟蒻将无比感激!!