#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m;
int dis[105], vis[105];
struct node {
int v, dis;
node(int a, int b): v(a), dis(b) {};
bool operator <(const node &a) const {
return a.dis < dis;
}
} ;
int mp[105][105];
void dij() {
int sum = 0;
int ans = 0;
priority_queue<node>q;
q.push(node(1, 0));
while(!q.empty()) {
int tmp = q.top().v;
int cost = q.top().dis;
q.pop();
if(vis[tmp]) continue;
sum += cost;
ans++;
vis[tmp] = 1;
for(int i = 1; i <= n; i++) {
if(!vis[i] && dis[i] > mp[tmp][i]) {
dis[i] = mp[i][tmp];
q.push(node(i, dis[i]));
}
}
}
// printf("%d %d\n",ans,sum);
if(ans == n) printf("%d\n", sum);
else printf("?\n");
}
int main() {
while(~scanf("%d%d", &m, &n), m) {
memset(mp, inf, sizeof(mp));
memset(dis, inf, sizeof(dis));
memset(vis,0,sizeof(vis));
dis[1] = 0;
for(int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
mp[u][v] = w;
mp[v][u] = w;
}
dij();
}
return 0;
}
最小生成树prim算法——堆优化模板(邻接矩阵存储)
最新推荐文章于 2020-09-15 16:59:16 发布