Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)

来源:互联网 发布:asp防止sql注入代码 编辑:程序博客网 时间:2024/06/06 09:36

题目链接:http://codeforces.com/problemset/problem/20/C

思路:需要用优化过的dijkstra,提供两种写法。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <set>#define REP(i, a, b) for (int i = (a); i < (b); ++i)#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)#define TR(iter, c) for (__typeof(c.begin()) iter = c.begin(); iter != c.end(); ++iter)using namespace std;const int MAX_N = (100000 + 100);const long long inf = 1LL << 60;int N, M, pre[MAX_N];long long dist[MAX_N];struct cmp {bool operator() (const int &p1, const int &p2) const {return dist[p1] <= dist[p2];}};vector<pair<int, int > > g[MAX_N];set<int, cmp> q;void Dijkstra(){dist[1] = 0;q.insert(1);while (!q.empty()) {int u = *q.begin();q.erase(q.begin());REP(i, 0, (int)g[u].size()) {int v = g[u][i].first, w = g[u][i].second;if (dist[u] + w < dist[v]) {q.erase(v);dist[v] = dist[u] + w;pre[v] = u;q.insert(v);}}}}void dfs(int u){if (u != 1) dfs(pre[u]);printf("%d ", u);}int main(){cin >> N >> M;FOR(i, 1, N) dist[i] = inf;FOR(i, 1, M) {int u, v, w; cin >> u >> v >> w;g[u].push_back(make_pair(v, w));g[v].push_back(make_pair(u, w));}Dijkstra();if (dist[N] >= inf) { puts("-1"); return 0; }dfs(N);return 0;}

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#define REP(i, a, b) for (int i = (a); i < (b); ++i)#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)using namespace std;const int MAX_N = (100000 + 100);const long long inf = 1LL << 60;int N, M, pre[MAX_N], vis[MAX_N];long long dist[MAX_N];struct cmp {bool operator() (const pair<long long, int>&p, const pair<long long, int>&q) const {return p.first >= q.first;}};vector<pair<int, int > > g[MAX_N];priority_queue<pair<long long, int>, vector<pair<long long, int> >, cmp> pq;void Dijkstra(){pq.push(make_pair(dist[1] = 0, 1));while (!pq.empty()) {pair<long long, int> p = pq.top();pq.pop();if (vis[p.second]) continue;vis[p.second] = 1;REP(i, 0, (int)g[p.second].size()) {int v = g[p.second][i].first, w = g[p.second][i].second;if (p.first + w < dist[v]) {dist[v] = p.first + w;pre[v] = p.second;if (!vis[v]) pq.push(make_pair(dist[v], v));}}}}void dfs(int u){if (u != 1) dfs(pre[u]);printf("%d ", u);}int main(){cin >> N >> M;FOR(i, 1, N) dist[i] = inf, vis[i] = 0;FOR(i, 1, M) {int u, v, w; cin >> u >> v >> w;g[u].push_back(make_pair(v, w));g[v].push_back(make_pair(u, w));}Dijkstra();if (dist[N] >= inf) { puts("-1"); return 0; }dfs(N);return 0;}


0 0
原创粉丝点击