uva 10986(最短路径)

来源:互联网 发布:php编写软件 编辑:程序博客网 时间:2024/06/17 01:37

题意:给出结点和路径的连通情况,以及路径的权值,问从起点到终点的最短距离是多少。

题解:因为结点数最大有20000个,用优先队列的dijkstra算法。普通的优先队列如果存的整数会把先整数大的先出队列,而此时需要把与起点距离最小的先出队,所以在结构体中需要重载小于符号。

#include <stdio.h>#include <string.h>#include <queue>#include <vector>using namespace std;const int N = 20000;const int INF = 0x3f3f3f3f;struct Sev {int n, w;Sev() {}Sev (int a, int b) {n = a;w = b;}bool operator < (const Sev &a) const {return w > a.w;}};vector<Sev> v[N];int n, m, sta, end, cases, t = 1;int dist[N];void dijkstra() {dist[sta] = 0;priority_queue <Sev> q;q.push(Sev(sta, 0));while (!q.empty()) {Sev u = q.top();q.pop();int len = v[u.n].size();for (int i = 0; i < len; i++) {Sev temp = v[u.n][i];if (dist[temp.n] > dist[u.n] + temp.w) {dist[temp.n] = dist[u.n] + temp.w;q.push(Sev(temp.n, temp.w));}}}}int main() {scanf("%d", &cases);while (cases--) {memset(dist, INF, sizeof(dist));scanf("%d%d%d%d", &n, &m, &sta, &end);for (int i = 0; i < n; i++)v[i].clear();int a, b, c;for (int i = 0; i < m; i++) {scanf("%d%d%d", &a, &b, &c);v[a].push_back(Sev(b, c));v[b].push_back(Sev(a, c));}dijkstra();printf("Case #%d: ", t++);if (dist[end] < INF)printf("%d\n", dist[end]);elseprintf("unreachable\n");}return 0;}


0 0
原创粉丝点击