题目链接
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2143.html
题目大意
就是求一个带权无向图的最短路径。
解题过程
之前看啊哈算法学了下dijkstra,然后嫌麻烦一直没用过。现在看了个视频才发现,用优先队列优化后,非常好用,比SPFA还容易写,于是放出来做个模板。
题目分析
略
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAX = 100+10;
vector<pair<int, int> > edges[MAX];
int d[MAX];
int main()
{
int n, m;
while (~scanf("%d %d", &n, &m))
{
for (int i = 1; i <= n; i++)
{
edges[i].clear();
d[i] = 1e9;
}
for (int i = 0; i < m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
edges[u].push_back(make_pair(v, w));
edges[v].push_back(make_pair(u, w));
}
int s = 1, t = n;
priority_queue<pair<int, int> >q;
d[s] = 0;
q.push(make_pair(-d[s], s));
while (!q.empty())
{
int u = q.top().second;
q.pop();
for (int i = 0; i < edges[u].size(); i++)
{
int v = edges[u][i].first;
if (d[v] > d[u] + edges[u][i].second)
{
d[v] = d[u] + edges[u][i].second;
q.push(make_pair(-d[v], v));
}
}
}
if (d[t] == 1e9)
printf("-1\n");
else
printf("%d\n", d[t]);
}
}