Advertisement
PikMike

Untitled

Oct 4th, 2016
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz(x) (int)(x).size()
  6. #define ll long long
  7. #define ld long double
  8. #define ft first
  9. #define sc second
  10. #define pii pair<int, int>
  11. #define pll pair<ll, ll>
  12. #define forn(i, t) for(int i = 0; i < (t); i++)
  13. #define fore(i, f, t) for(int i = (f); i < (t); i++)
  14. #define forr(i, f, t) for(int i = (f) - 1; i >= (t); i--)
  15. #define all(x) (x).begin(), (x).end()
  16. #define ins insert
  17.  
  18. const int INF = 1e9;
  19. const int MOD = 1000000007;
  20. const ll INF64 = 9223372036854775807;
  21. const ld EPS = 1e-7;
  22.  
  23. using namespace std;
  24.  
  25. struct edge{
  26.     int v, u, w;
  27.     edge(int v, int u, int w) : v(v), u(u), w(w){}
  28. };
  29.  
  30. const int N = 1001;
  31.  
  32. vector<pii> g[N], z[N], r[N];
  33. vector<edge> e;
  34.  
  35.  
  36. void Dijkstra(int s, vector<int> &d) {
  37.     d[s] = 0;
  38.     set<pii> q;
  39.     q.insert(mp(d[s], s));
  40.     while (!q.empty()){
  41.         int u = q.begin()->sc;
  42.         q.erase(q.begin());
  43.  
  44.         forn(i, sz(g[u])){
  45.             int v = g[u][i].ft;
  46.             int w = g[u][i].sc;
  47.             if (d[u] + w < d[v]) {
  48.                 q.erase(mp(d[v], v));
  49.                 d[v] = d[u] + w;
  50.                 q.insert(mp(d[v], v));
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56.  
  57. void DijkstraRev(int s, vector<int> &d) {
  58.     d[s] = 0;
  59.     set<pii> q;
  60.     q.insert(mp(d[s], s));
  61.     while (!q.empty()){
  62.         int u = q.begin()->sc;
  63.         q.erase(q.begin());
  64.  
  65.         forn(i, sz(z[u])){
  66.             int v = z[u][i].ft;
  67.             int w = z[u][i].sc;
  68.             if (d[u] + w < d[v]) {
  69.                 q.erase(mp(d[v], v));
  70.                 d[v] = d[u] + w;
  71.                 q.insert(mp(d[v], v));
  72.             }
  73.         }
  74.     }
  75. }
  76.  
  77.  
  78. vector<char> used;
  79. int dp[N][2], n;
  80. vector<int> d1, d2;
  81.  
  82.  
  83. void dfs(int v, int &k){
  84.     used[v] = 1;
  85.     int u, w;
  86.     forn(i, sz(r[v])){
  87.         u = r[v][i].ft;
  88.         w = r[v][i].sc;
  89.         if (!used[u])
  90.             dfs(u, k);
  91.         if (d1[v] + d2[u] + w == k){
  92.             dp[v][0] += dp[u][0];
  93.             dp[v][1] += dp[u][1];
  94.         }
  95.         else if (d1[v] + d2[u] + w == k + 1)
  96.             dp[v][1] += dp[u][0];
  97.     }
  98. }
  99.  
  100.  
  101. void solve(){
  102.     int m, f, t, w;
  103.     scanf("%d%d", &n, &m);
  104.     memset(dp, 0, sizeof(dp));
  105.     e = vector<edge>();
  106.     used = vector<char>(n, 0);
  107.     forn(i, n)
  108.         r[i] = z[i] = g[i] = vector<pii>();
  109.     d1 = d2 = vector<int>(n, INF);
  110.     forn(i, m){
  111.         scanf("%d%d%d", &f, &t, &w);
  112.         g[--f].pb(mp(--t, w));
  113.         z[t].pb(mp(f, w));
  114.         e.pb(edge(f, t, w));
  115.     }
  116.     scanf("%d%d", &f, &t);
  117.     --f, --t;
  118.     Dijkstra(f, d1);
  119.     DijkstraRev(t, d2);
  120.     int k = d1[t];
  121.     forn(i, m)
  122.         if (d1[e[i].v] + d2[e[i].u] + e[i].w <= k + 1){
  123.             r[e[i].v].pb(mp(e[i].u, e[i].w));
  124.         }
  125.     dp[t][0] = 1;
  126.     dfs(f, k);
  127.     printf("%d\n", dp[f][0] + dp[f][1]);
  128. }
  129.  
  130.  
  131. int main(){
  132.     int n;
  133.     scanf("%d", &n);
  134.     forn(i, n)
  135.         solve();
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement