这题哪里和最小生成树有关系???
不明白呀!
问有几条路径的题,一般都是乘法原理
#include<iostream> #include<cstring> #include<queue> #include<vector> #include<algorithm> #define maxn 1010 using namespace std; const long long INF = 2147483647; int dis[maxn]; int vis[maxn]; struct Node { int p; int len; Node(int a, int b) :p(a), len(b) {} }; int cnt[maxn]; vector<Node>G[maxn]; void insert(int be, int en, int len) { G[be].push_back(Node(en, len)); } int n, m; bool operator < (const Node a, const Node b) { return a.len > b.len; } int dijstra() { memset(dis, 0x3f3f3f3f,sizeof(dis)); priority_queue<Node>que; que.push(Node(1,0)); dis[1] = 0; while (!que.empty()) { Node ans = que.top(); que.pop(); if (vis[ans.p]) continue; vis[ans.p] = 1; for (int i = 0; i < G[ans.p].size(); i++) { int p = G[ans.p][i].p; if (dis[p] > dis[ans.p] + G[ans.p][i].len) { dis[p] = dis[ans.p] + G[ans.p][i].len; que.push(Node(p, dis[p])); } } } return 0; } int main() { int be, en; int len; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d %d %d", &be, &en, &len); insert(be, en, len); insert(en, be, len); } dijstra(); for (int i = 1; i <= n; i++) { for (int j = 0; j < G[i].size(); j++) { int be = i; int en = G[i][j].p; int len = G[i][j].len; if (dis[be] + len == dis[en]) { cnt[en]++; } } } long long ans = 1; for (int i = 2; i <= n; i++) { ans = (ans*cnt[i]) % INF; } printf("%lld\n", ans); return 0; }