poj2387
最短路
View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
#define V 1005
#define E 5005
#define inf 0x3f3f3f3f;
int cost[E], dist[V];
int e, pnt[E], nxt[E], head[V], prev[V], vis[V];
int n, m;
struct qnode
{
int v, c;
qnode(int vv = 0, int cc = 0) :
v(vv), c(cc)
{
}
bool operator <(const qnode &r) const
{
return c > r.c;
}
};
void dijkstra(int n, const int src)
{
qnode mv;
int i, j, k, pre;
priority_queue<qnode> que;
vis[src] = 1;
dist[src] = 0;
que.push(qnode(src, 0));
for (pre = src, i = 1; i < n; i++)
{
for (j = head[pre]; j != -1; j = nxt[j])
{
k = pnt[j];
if (vis[k] == 0 && dist[pre] + cost[j] < dist[k])
{
dist[k] = dist[pre] + cost[j];
que.push(qnode(pnt[j], dist[k]));
prev[k] = pre;
}
}
while (!que.empty() && vis[que.top().v] == 1)
que.pop();
if (que.empty())
break;
mv = que.top();
que.pop();
vis[pre = mv.v] = 1;
}
}
inline void addedge(int u, int v, int c)
{
pnt[e] = v;
cost[e] = c;
nxt[e] = head[u];
head[u] = e++;
}
void init(int nv, int ne)
{
int i, u, v;
int c;
e = 0;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
memset(prev, -1, sizeof(prev));
for (i = 0; i < nv; i++)
dist[i] = inf;
for (i = 0; i < ne; ++i)
{
scanf("%d%d%d", &u, &v, &c);
u--, v--;
addedge(u, v, c);
addedge(v, u, c);
}
}
int main()
{
//freopen("t.txt", "r", stdin);
scanf("%d%d", &m, &n);
init(n, m);
dijkstra(n, 0);
printf("%d\n", dist[n - 1]);
return 0;
}