Dijkstra 优先级队列 实现 POJ 2387

#include <cstdio> #include <queue> #include <list> #include <utility> using namespace std; const int INF = 1000000000; // <dis and vertex> typedef pair<int, int> pii; // <vertex and dis> typedef pair<int, int> edge; int T, N; int d[1001]; bool vis[1001]; list<edge> v[1001]; priority_queue<int, vector<pii>, greater<pii> >q; void readData() { int f, t, w; for(int i = 1; i <= T; i++) { scanf("%d%d%d", &f, &t, &w); //printf("%d %d %d\n", f, t, w); v[f].push_front(make_pair(t, w)); v[t].push_front(make_pair(f, w)); } } void init() { for(int i = 1; i < N; i++) { d[i] = INF; vis[i] = false; } d[N] = 0; q.push(make_pair(d[N], N)); } void dijkstra() { while(!q.empty()) { pii u = q.top(); q.pop(); int vertex = u.second; if(vis[vertex]) { continue; } vis[vertex] = true; list<edge> es = v[vertex]; list<edge>::iterator it; //printf("checking %d's edges\n", vertex); for(it = es.begin(); it != es.end(); it++) { int v = it->first; //printf("checking %d\n", v); if (d[v] > d[vertex] + it->second) { d[v] = d[vertex] + it->second; q.push(make_pair(d[v], v)); } } } printf("%d\n", d[1]); } int main() { scanf("%d%d", &T, &N); readData(); init(); dijkstra(); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值