A - Til the Cows Come Home POJ - 2387
最短路
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 2010;
typedef pair<int, int> PII; // first 存距离 second 存编号
int T, N;
int head[maxn], cnt;
int dis[maxn];
bool st[maxn]; // 第 i 个点的最短路是否确定,是否需要更新
struct node {
int to, w, next;
}e[maxn];
void add(int u, int v, int w) {
e[++cnt].next = head[u];
e[cnt].to = v;
e[cnt].w = w;
head[u] = cnt;
}
void init() {
memset(dis, 0x3f3f3f3f, sizeof(dis));
memset(head, 0, sizeof(head));
memset(e, 0, sizeof(e));
memset(st, 0, sizeof(st));
cnt = 0;
}
int dijkstra() {
dis[N] = 0; // 第 n 个点到起点的距离
priority_queue<PII, vector<PII>, greater<PII> > heap; // 小根堆
heap.push({0,N});
while(heap.size()) {
PII t = heap.top();
heap.pop();
int ver = t.second, dist = t.first;
if(st[ver]) continue;
st[ver] = 1;
for(int i = head[ver]; i; i = e[i].next) {
int to = e[i].to;
if(dis[to] > dist + e[i].w) {
dis[to] = dist + e[i].w;
heap.push({dis[to], to});
}
}
}
}
int main() {
// freopen("test.in", "r", stdin);
while(~scanf("%d%d", &T, &N)) {
init();
for(int i = 1; i <= T; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w); add(v, u, w);
}
dijkstra();
if(dis[1] != 0x3f3f3f3f) {
printf("%d\n", dis[1]);
}
}
return 0;
}