图:最小生成树(prim算法和kruskal算法)

prim算法

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#define INF INT_MAX
using namespace std;
int prim(vector<vector<pair<int,int> > >& graph,vector<int>& vis,vector<int>& dis){
	dis[0] = 0;
	int n = graph.size(),ans = 0;
	for(int i=1;i<=n;i++){
		int u = -1,mdis = INF;
		for(int j=0;j<n;j++){
			if(vis[j] == 0 && dis[j] < mdis){
				mdis = dis[j];
				u = j;
			}
		}
		if(u == -1) return -1;
		vis[u] = 1;
		ans += dis[u];
		for(int j=0;j<graph[u].size();j++){
			int v = graph[u][j].first;
			if(vis[v] == 0 && graph[u][j].second < dis[v]) dis[v] = graph[u][j].second;
		}
	}
	return ans;
}
int main(){
	int vs,es;
	cin>>vs>>es;
	vector<vector<pair<int,int> > > graph(vs);
	vector<int> vis(vs);
	vector<int> dis(vs);
	for(int i=0;i<es;i++){
		int u,v,w;
		cin>>u>>v>>w;
		graph[u].push_back(make_pair(v,w));
		graph[v].push_back(make_pair(u,w));
	}
	fill(vis.begin(),vis.end(),0);
	fill(dis.begin(),dis.end(),INF);
	cout<<prim(graph,vis,dis)<<endl;
	return 0;
}

kruskal算法

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct node{
	int u;
	int v;
	int w;
	node(){}
	node(int _u,int _v,int _w):u(_u),v(_v),w(_w){}
	friend bool operator < (node a,node b){
		return a.w < b.w;
	}
};
int findFa(vector<int>& fa,int x){
	int a = x;
	while(x != fa[x]) x = fa[x];
	while(a != x){
		int z = fa[a];
		fa[a] = x;
		a = z;
	}
	return x;
}
int kruskal(vector<node>& graph,vector<int>& fa){
	int n = fa.size(),m = graph.size();
	int ans = 0,num_edge = 0;
	for(int i=0;i<m;i++){
		int faU = findFa(fa,graph[i].u);
		int faV = findFa(fa,graph[i].v);
		if(faU != faV){
			fa[faU] = faV;
			ans += graph[i].w;
			num_edge++;
			if(num_edge == n-1) return ans;
		}
	}
	return -1;
}
int main(){
	int vs,es;
	cin>>vs>>es;
	vector<node> graph;
	vector<int> fa(vs);
	for(int i=0;i<es;i++){
		int u,v,w;
		cin>>u>>v>>w;
		graph.push_back(node(u,v,w));
	}
	for(int i=0;i<vs;i++) fa[i] = i;
	sort(graph.begin(),graph.end());
	cout<<kruskal(graph,fa)<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_35338624/article/details/90140826
今日推荐