最短路径,dijkstra算法
题目意思:
有n个地点,编号从1 到 n, 题目给出m条边。要求从点n到点1 的最短路径。
裸的 最短路径,dijkstra算法。
本题要点:
1、用邻接表来存图,双向边。
2、dijkstra 算法,用堆来优化。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int MaxN = 1010, MaxM = 4010;
int head[MaxN], edge[MaxM], Next[MaxM], d[MaxN], ver[MaxM];
bool vis[MaxN];
int n, m, tot;
priority_queue<pair<int, int> > pq;
void add(int x, int y, int z)
{
ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
}
void dijkstra()
{
memset(d, 0x3f, sizeof d);
memset(vis, 0 ,sizeof vis);
d[n] = 0;
pq.push(make_pair(0, n));
while(pq.size())
{
int x = pq.top().second; pq.pop();
if(vis[x])
continue;
vis[x] = true;
for(int i = head[x]; i; i = Next[i])
{
int y = ver[i], z = edge[i];
if(d[y] > d[x] + z)
{
d[y] = d[x] + z;
pq.push(make_pair(-d[y], y));
}
}
}
}
int main()
{
int x, y, z;
scanf("%d%d", &m, &n);
for(int i = 0; i < m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
dijkstra();
printf("%d\n", d[1]);
return 0;
}
/*
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
*/
/*
90
*/