Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ctime>
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <utility>
- #include <queue>
- #include <algorithm>
- using namespace std;
- // TEMPLATE {{{
- #ifndef LOCAL
- #define OJ 1
- #else
- #define OJ 0
- #endif
- #define endl '\n'
- #define TIMESTAMP merr << "Execution time: " << fixed << setprecision(3) << (double)clock()/CLOCKS_PER_SEC << " s.\n"
- class C_ {}; template <typename T> C_& operator <<(C_& __m, const T& __s) { if (!OJ) cerr << "\E[91m" << __s << "\E[0m"; return __m; }
- C_ merr;
- struct __s { __s() { if (OJ) { ios_base::Init i; cin.sync_with_stdio(0); cin.tie(0); } } ~__s(){ TIMESTAMP; } } __S;
- /// END OF TEMPLATE }}}
- vector<pair<int,long long> > G[111111];
- long long D[111111];
- int n,m,source,dest;
- void input() {
- cin >> n >> m >> source >> dest;
- for (int i = 0; i < m; i++) {
- int u,v,w;
- cin >> u >> v >> w;
- G[u].push_back(make_pair(v,w));
- G[v].push_back(make_pair(u,w));
- }
- }
- void gen()
- {
- int M = 30;
- int W = (int)8e8;
- source = 90;
- dest = 1;
- for (int i = 0; i < M; i++)
- G[i].push_back(make_pair(i + 1, 0));
- G[0].push_back(make_pair(M, W));
- n = M;
- for (int i = 0; i < M; i++)
- {
- G[n].push_back(make_pair(n + 2, W >> i));
- G[n].push_back(make_pair(n + 1, 0));
- G[n + 1].push_back(make_pair(n + 2, 0));
- n += 2;
- }
- n++;
- for (int i = 0; i < n; i++)
- random_shuffle(G[i].begin(), G[i].end());
- }
- void gen1() {
- n = 60;
- m = 0;
- source = n-1;
- dest = 1;
- for (int i = 0; i < n; i++) {
- for (int j = i+1; j < n; j++) {
- long long w = j-i;
- for (int k = i+1; k <= j; k++) {
- w += (1LL<<k);
- }
- G[i].push_back(make_pair(j,w));
- G[j].push_back(make_pair(i,w));
- m++;
- }
- }
- }
- int main(void) {
- queue<int> Q;
- long long ans;
- long long idx = 0;
- for (int i = 0; i < 111111; i++) { D[i] = 1000000000000000000LL; }
- //input();
- gen();
- //merr << "m = " << m << '\n';
- D[source] = 0;
- Q.push(source);
- while (Q.size()) {
- idx++;
- int v = Q.front();
- Q.pop();
- for (int i = 0; i < (int)G[v].size(); i++) {
- int vv = G[v][i].first;
- long long ww = G[v][i].second;
- if (D[vv] > D[v]+ww) {
- D[vv] = D[v]+ww;
- Q.push(vv);
- }
- }
- }
- ans = D[dest];
- if (ans >= 1000000000000000000LL) ans = -1;
- cout << ans << endl;
- merr << "idx = " << idx << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment