Day 48 算法笔记之提高篇(4)10.5 最小生成树

目录

1.prime算法

1.1邻接矩阵

1.2邻接表

2.kruskal算法


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;
}

おすすめ

転載: blog.csdn.net/aixiaoxiao13/article/details/121635425