Prim算法
复杂度:O(N*N)
#include
using namespace std;
const int maxn = 1005;
int n;
int d[maxn], vis[maxn], mat[maxn][maxn];
int main(){
int End, ans = 0;
memset(d, 0x3f3f3f3f, sizeof(d));
d[1] = 0;
scanf("%d", &n);
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
scanf("%d", &mat[i][j]);
}
}
for(int i=1; i<=n; i++){
End = -1;
for(int j=1; j<=n; j++){
if(!vis[j] && (End==-1 || d[j]mat[End][j]){
d[j] = mat[End][j];
}
}
}
printf("%d\n", ans);
return 0;
}
堆优化的Prim算法
复杂度:O(MlogM)
#include
using namespace std;
const int maxn = 100005;
typedef pair P;
vector g[maxn];
priority_queue
, greater
> pq;
int n, m;
int vis[maxn];
int main(){
int ans;
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++){
int t1, t2, t3;
scanf("%d%d%d", &t1, &t2, &t3);
g[t1].push_back(make_pair(t3, t2));
g[t2].push_back(make_pair(t3, t1));
}
for(int i=0; i
Kruscal算法
复杂度:O(MlogM+M*Ackermann'(M))
#include
using namespace std;
const int maxn = 1000005;
typedef struct {
int from, to, val;
}N;
N edge[maxn];
int n, m;
int pre[maxn];
bool cmp(N a, N b){
return a.val < b.val;
}
int Find(int x){
int p, tmp;
p = x;
while(x != pre[x]){
x = pre[x];
}
while(p != x){
tmp = pre[p];
pre[p] = x;
p = tmp;
}
return x;
}
int main(){
int ans;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++){
pre[i] = i;
}
for(int i=1; i<=m; i++){
scanf("%d%d%d", &edge[i].from, &edge[i].to, &edge[i].val);
}
sort(edge+1, edge+m+1, cmp);
ans = 0;
for(int i = 1; i<=m; i++){
int p = Find(edge[i].from);
int q = Find(edge[i].to);
if(p != q){
ans += edge[i].val;
pre[p] = q;
}
}
printf("%d\n", ans);
return 0;
}