Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <fstream>
- #include <cmath>
- #include <algorithm>
- #include <ctime>
- #include <cctype>
- #include <cstdlib>
- #include <cassert>
- #include <functional>
- #include <iomanip>
- #include <string>
- #include <cstring>
- #include <map>
- #include <set>
- #include <vector>
- #include <queue>
- using namespace std;
- int s, f;
- vector <pair <int, int> > g[3000];
- queue < pair<int, int> > bfs;
- const int INF = 1000000000;
- int used[3000];
- int am[5000];
- int bm[5000];
- int rm[5000];
- string d[3000];
- int ans = 1e9;
- string sum(const string &a1, const string &b1)
- {
- string a = a1;
- string b = b1;
- //длинное сложение
- //cerr << a << endl << b << endl;
- for(int i = 0; i < 2100; i++)
- {
- am[i] = 0;
- bm[i] = 0;
- rm[i] = 0;
- }
- int u1 = 1;
- int u2 = 1;
- if(a.size() > b.size())
- {
- int r = a.size() - b.size();
- u2 += r;
- }
- if(a.size() < b.size())
- {
- int r = b.size() - a.size();
- u1 += r;
- }
- //cerr << u1 << " " << u2 << endl;
- for(int i = u1; i < u1 + a.size(); i++)
- am[i] = a[i - u1] - '0';
- for(int i = u2; i < u2 + b.size(); i++)
- bm[i] = b[i - u2] - '0';
- for(int i = 0; i < u2 + b.size(); i++)
- rm[i] = am[i] + bm[i];
- for(int i = u2 + b.size(); i > 0; i--)
- {
- if(rm[i] >= 10)
- {
- rm[i] -= 10;
- rm[i - 1]++;
- }
- }
- string answer = "";
- int flag = 0;
- for(int i = 0; i < u1 + a.size(); i++)
- {
- if(rm[i] != 0)
- flag = 1;
- if(flag == 1)
- answer.push_back( char( int(rm[i]) + int('0') ) );
- }
- //cerr << answer << endl;
- return answer;
- }
- string rec(int x)
- {
- if(d[x] == "")
- {
- if(x == s)
- {
- return("1");
- }
- string res = "00000000";
- for(int i = 0; i < g[x].size(); i++)
- {
- if(used[g[x][i].first] == used[x] - g[x][i].second)
- {
- //cerr << "(" << res << " " << rec(g[x][i].first) << ")" << endl;
- res = sum(res, rec(g[x][i].first) );
- }
- }
- d[x] = res;
- return res;
- }
- else
- return(d[x]);
- }
- int main ()
- {
- int n, m;
- cin >> n >> m;
- for(int i = 0; i < 2000; i++)
- used[i] = 1e8;
- for(int i = 0; i < m; i++)
- {
- int a, b, c;
- scanf("%d%d%d", &a, &b, &c);
- a--;
- b--;
- g[a].push_back(make_pair(b, c));
- g[b].push_back(make_pair(a, c));
- }
- cin >> s >> f;
- s--;
- f--;
- vector<int> dist (n, INF), p (n);
- dist[s] = 0;
- vector<char> u (n);
- for (int i=0; i<n; ++i) {
- int v = -1;
- for (int j=0; j<n; ++j)
- if (!u[j] && (v == -1 || dist[j] < dist[v]))
- v = j;
- if (dist[v] == INF)
- break;
- u[v] = true;
- for (size_t j=0; j<g[v].size(); ++j) {
- int to = g[v][j].first,
- len = g[v][j].second;
- if (dist[v] + len < dist[to]) {
- dist[to] = dist[v] + len;
- p[to] = v;
- }
- }
- }
- for(int i = 0; i < n; i++)
- used[i] = dist[i];
- if(used[f] == INF)
- {
- cout << 0;
- return 0;
- }
- int flag = 0;
- //return 0;
- string answer = rec(f);
- for(int i = 0; i < answer.size(); i++)
- {
- if(flag == 0 && answer[i] != '0')
- {
- flag = 1;
- }
- if(flag == 1)
- cout << answer[i];
- }
- //cout << rec(f);
- return 0;
- }
Add Comment
Please, Sign In to add comment