目录
1.prime算法
1.1邻接矩阵
const int maxv=1000;
const int inf=10000000;
int n,g[maxv][maxv];
int d[maxv];
bool vis[maxv] = {false};
intprime(){
fill(d,d+maxv,inf);
d[0] = 0;
int ans = 0;
for(int i=0;i<n;i++){
int u=-1,min=inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u = j;
min = d[j];
}
}
if(u==-1) return -1;
vis[u] = true;
ans+=d[u];
for(int v=0;v<n;v++){
if(vis[v]==false&&g[u][v]!=inf&&g[u][v]<d[v]){
d[v] = g[u][v];
}
}
}
return ans;
}
1.2邻接表
const int maxv=1000;
const int inf=10000000;
struct node{
int v,dis;
};
vector<node> adj[maxv];
int n;
int d[maxv];
bool vis[maxv] = {false};
intprime(){
fill(d,d+maxv,inf);
d[0] = 0;
int ans=0;
for(int i=0;i<n;i++){
int u=-1,min=inf;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u = j;
min = d[j];
}
}
if(u==-1) return -1;
vis[u]=true;
ans+=d[u];
for(int j=0;j<adj[u].size();j++){
int v = adj[u][j].v;
if(vis[v]==false&&adj[u][v].dis<d[v]){
d[v] = g[u][v];
}
}
}
return ans;
}
2.kruskal算法
const int maxe=1000;
const int inf=10000000;
struct edge{
int u,v;
int cost;
}e[maxe];
int father[N];
int findfather(int x){
while(x!=father[x]){
x = father[x];
}
}
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
int kruskal(int n,int m){
int ans=0,num_edge=0;
for(int i=1;i<=n;i++){
father[i] = i;
}
sort(e,e+m,cmp);
for(int i=0;i<m;i++){
int fau = findfather(e[i].u);
int fav = findfather(e[i].v);
if(fau!=fav){
father[fau] = fav;
ans+=e[i].cost;
num_edge++;
if(num_edge==n-1) break;
}
}
if(num_edge!=n-1) return -1;
else return ans;
}