Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <set>
- #include <map>
- #include <list>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <bitset>
- #include <string>
- #include <cctype>
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include <algorithm>
- // #include <unordered_map>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<int, int> pii;
- typedef pair<ull, ull> puu;
- #define inf (0x3f3f3f3f)
- #define lnf (0x3f3f3f3f3f3f3f3f)
- #define eps (1e-9)
- #define fi first
- #define se second
- bool sgn(double a, string select, double b) {
- if(select == "==")return fabs(a - b) < eps;
- if(select == "!=")return fabs(a - b) > eps;
- if(select == "<")return a - b < -eps;
- if(select == "<=")return a - b < eps;
- if(select == ">")return a - b > eps;
- if(select == ">=")return a - b > -eps;
- }
- //--------------------------
- const ll mod = 1000000007;
- const int maxn = 100010;
- //use to bfs
- struct Node {
- int v, c;
- int kind;
- Node(int _v = 0, int _c = 0, int _kind = 0) {
- v = _v, c = _c, kind = _kind;
- }
- bool operator<(const Node &a)const {
- return c > a.c;
- }
- };
- //first is 'v' , second is 'cost'
- vector<pii> edge[maxn];
- bool vis[maxn][2];
- int dist[maxn][2];
- int sav[maxn][2];
- void addedge(int u, int v, int w) {
- edge[u].push_back(make_pair(v, w));
- }
- // id from 1
- int dijkstra_heap(int n, int start, int stop) {
- memset(vis, 0, sizeof(vis));
- memset(sav, 0, sizeof(sav));
- for(int i = 1; i <= n; i++) dist[i][0] = dist[i][1] = inf;
- priority_queue<Node> que;
- while(!que.empty())que.pop();
- dist[start][0] = 0;
- sav[start][0] = 1;
- que.push(Node(start, 0, 0));
- Node tmp;
- while(!que.empty()) {
- tmp = que.top();
- que.pop();
- int u = tmp.v;
- int kind = tmp.kind;
- if(vis[u][kind])continue;
- vis[u][kind] = true;
- for(int i = 0; i < edge[u].size(); i++) {
- int v = edge[u][i].fi;
- int cost = edge[u][i].se;
- if(dist[u][kind] + cost < dist[v][0]) {
- dist[v][1] = dist[v][0];
- sav[v][1] = sav[v][0];
- dist[v][0] = dist[u][kind] + cost;
- sav[v][0] = sav[u][kind];
- que.push(Node(v, dist[v][0], 0));
- que.push(Node(v, dist[v][1], 1));
- } else if(dist[u][kind] + cost == dist[v][0]) {
- sav[v][0] += sav[u][kind];
- } else if(dist[u][kind] + cost < dist[v][1]) {
- dist[v][1] = dist[u][kind] + cost;
- sav[v][1] = sav[u][kind];
- que.push(Node(v, dist[v][1], 1));
- } else if(dist[u][kind] + cost == dist[v][1]) {
- sav[v][1] += sav[u][kind];
- }
- }
- }
- if(dist[stop][0] + 1 == dist[stop][1])return sav[stop][0] + sav[stop][1];
- return sav[stop][0];
- }
- int s, t;
- int n, m;
- void solve() {
- int kase;
- scanf("%d", &kase);
- while(kase--) {
- for(int i = 1; i <= n; i++) {
- edge[i].clear();
- }
- scanf("%d%d", &n, &m);
- int u, v, w;
- for(int i = 0; i < m; i++) {
- scanf("%d%d%d", &u, &v, &w);
- addedge(u, v, w);
- }
- scanf("%d%d", &s, &t);
- int ans = dijkstra_heap(n, s, t);
- printf("%d\n", ans );
- }
- }
- int main() {
- #ifndef ONLINE_JUDGE
- freopen("1.in", "r", stdin);
- freopen("1.out", "w", stdout);
- #endif
- // iostream::sync_with_stdio(false);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment