思路
最短路径生成树计数
代码
//
//
#include <bits/stdc++.h>
using namespace std;
//#define mp make_pair
#define pii pair<int,int>
#define pb push_back
#define ll long long
#define LL long long
#define ld long double
#define endl '\n'
#define RE0 return 0
#define For(i,j,k) for (int i=(int)(j);i<=(int)(k);i++)
#define Rep(i,j,k) for (int i=(int)(j);i>=(int)(k);i--)
//#define int long long
#define db double
const int maxn = 1e3 + 10;
const int maxm = 1e6 + 10;
const int P = (1<<31)-1; //998244353
const int INF = 0x3f3f3f3f;
const double eps=1e-7;
struct Edge {
int to, dis, next;
}edge[maxm];
int n, m;
int head[maxn], dis[maxn], cnt;
bool vis[maxn];
struct node {
int dis;
int pos;
node(int _dis = 0, int _pos = 0) : dis(_dis), pos(_pos) {}
bool operator <(const node &x) const {
return dis > x.dis;
}
};
void add_edge(int u, int v, int w) {
cnt++;
edge[cnt].to = v;
edge[cnt].dis = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
priority_queue<node> q;
void dijkstra(int s) {
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
q.push(node(0, s));
while(!q.empty()) {
node tmp = q.top();
q.pop();
int x = tmp.pos;
if(vis[x]) continue;
vis[x] = true;
for(int i = head[x]; i; i = edge[i].next) {
int y = edge[i].to;
if(dis[y] > dis[x] + edge[i].dis)
dis[y] = dis[x] + edge[i].dis,
q.push(node(dis[y], y));
}
}
}
bool cmp(int x, int y) {
return dis[x] < dis[y];
}
int id[maxn];
int mp[maxn][maxn];
void solve() {
cin >> n >> m;
memset(mp, 0x3f, sizeof(mp));
for(int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
mp[v][u] = mp[u][v] = min(mp[u][v], w);
add_edge(u, v, w);
add_edge(v, u, w);
}
dijkstra(1);
for(int i = 1; i <= n; i++) id[i] = i;
sort(id + 1, id + n + 1, cmp);
ll ans = 1;
int cnt = 0;
for(int i = 2; i <= n; i++) {
cnt = 0;
for(int j = 1; j <= i - 1; j++) {
if(dis[id[i]] == dis[id[j]] + mp[id[i]][id[j]]) cnt++;
}
ans = ans * cnt % P;
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// int T; scanf("%d", &T); while(T--)
// freopen("1channel00.txt","r",stdin);
// freopen("2.txt","w",stdout);
// int T; cin >> T; while(T--)
solve();
RE0;
}