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;
- int used[3000];
- int am[5000];
- int bm[5000];
- int rm[5000];
- string d[3000];
- int ans = 1e9;
- string sum1(const string &a1, const string &b1)
- {
- string a = a1;
- string b = b1;
- int flag = 0;
- string s1 = "";
- while(a.size() != b.size())
- {
- if(a.size() > b.size())
- b = '0' + b;
- else
- a = '0' + a;
- }
- for(int i = 0; i <= a.size(); i++)
- s1 += '0';
- for(int i = max(a.size(), b.size()) - 1; i >= 0; i--)
- {
- int a1, b1;
- a1 = int(a[i]) - int('0');
- b1 = int(b[i]) - int('0');
- s1[i + 1] = char( ((a1 + b1 + flag) % 10) + '0' );
- //cerr << a1 << " " << b1 << " " << s1[i + 1] << endl;
- flag = (a1 + b1 + flag) / 10;
- }
- s1[0] = char(flag + '0');
- //cerr << a << "+" << b << "=" << s1 << endl;
- return s1;
- }
- string sum(const string &a1, const string &b1)
- {
- string a = a1;
- string b = b1;
- //длинное сложение
- cerr << a << endl << b << endl;
- for(int i = 0; i < 3000; 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 < 3000; i++)
- rm[i] = am[i] + bm[i];
- for(int i = 3000; i > 0; i--)
- {
- if(rm[i] >= 10)
- {
- rm[i] -= 10;
- rm[i - 1]++;
- }
- }
- string answer = "";
- for(int i = 0; i < u1 + a.size(); i++)
- 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);
- g[a].push_back(make_pair(b, c));
- g[b].push_back(make_pair(a, c));
- }
- cin >> s >> f;
- bfs.push( make_pair(s, 0) );
- used[s] = 0;
- while(!bfs.empty())
- {
- pair<int, int> t;
- t = bfs.front();
- if(t.first == f)
- {
- ans = min(ans, t.second);
- }
- bfs.pop();
- for(int i = 0; i < g[t.first].size(); i++)
- {
- if(used[ g[t.first][i].first ] > t.second + g[t.first][i].second)
- {
- bfs.push(make_pair(g[t.first][i].first, g[t.first][i].second + t.second));
- used[g[t.first][i].first] = g[t.first][i].second + t.second;
- }
- }
- }
- //for(int i = 0; i < 2000; i++)
- // used[i] = 0;
- if(ans == 1e9)
- {
- 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