kruscal算法
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,tot=0,k=0;
int fat[200010];
struct node
{
int from,to,dis;
}edge[200010];
bool cmp(const node &a,const node &b)
{
return a.dis<b.dis;
}
int father(int x)
{
if(fat[x]!=x)
return father(fat[x]);
else return x;
}
void unionn(int x,int y)
{
fat[father(y)]=father(x);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].dis);
}
for(int i=1;i<=n;i++) fat[i]=i;
sort(edge+1,edge+1+m,cmp);
for(int i=1;i<=m;i++)
{
if(k==n-1) break;
if(father(edge[i].from)!=father(edge[i].to))
{
unionn(edge[i].from,edge[i].to);
tot+=edge[i].dis;
k++;
}
}
printf("%d",tot);
return 0;
}
prime算法
#include <bits/stdc++.h>
using namespace std;
int n, m;
int e[5005][5005], book[5005];
int dis[5005];
int inf = 0x3f3f3f3f;
int ans = 0;
int prime()
{
book[1] = 1;
for(int i = 1; i < n; i++)
{
int minn = inf;
int u = 0;
for(int j = 1; j <= n; j++)
{
if(book[j] == 0 && dis[j] < minn)
{
minn = dis[j];
u = j;
}
}
if(u == 0)
return -1;
book[u] = 1;
ans += dis[u];
for(int j = 1; j <= n; j++)
{
if(book[j] == 0 && e[u][j] < dis[j])
dis[j] = e[u][j];
}
}
return ans;
}
int main()
{
cin >> n >> m;
memset(book, 0, sizeof(book));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
e[i][j] = 0;
else
e[i][j] = inf;
}
}
for(int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
if(z < e[x][y])
e[x][y] = e[y][x] = z;
}
for(int i = 1; i <= n; i++)
dis[i] = e[1][i];
int res = prime();
if(res == -1)
cout << "orz";
else
cout << res;
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-42065.html