关闭

图论之最小生成树

62人阅读 评论(0) 收藏 举报
分类:

最小生成树的题目比较模式化,一般模板即可解决问题。

Prim:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#define maxn 1000
#define INF 0x7f7f7f7f
using namespace std;
struct Edge{
	int dist,to;
	bool operator < (Edge rhs) const {
		return dist>rhs.dist;
	}
	Edge(int dist,int to):dist(dist),to(to){}
};
int n,m;
struct Prim{
	int n,m,ans;
	bool done[maxn];
	int d[maxn];
	vector<Edge> G[maxn];
	void init(int n){
		this->n=n;
		for (int i=0;i<n;i++)G[i].clear();
	}
	void addedge(int u,int v,int w){
		G[u].push_back(Edge(w,v));
		G[v].push_back(Edge(w,u));
	}
	void prim(){
		priority_queue<Edge> Q;
		memset(done,0,sizeof(done));
		for (int i=0;i<n;i++)d[i]=INF;
		d[0]=0;ans=0;
		Q.push(Edge(0,0));
		while (!Q.empty()){
			Edge now=Q.top();Q.pop();
			int u=now.to;
			if (done[u])continue;
			done[u]=true;
			ans+=d[u];
			for (int i=0;i<G[u].size();i++){
				Edge e=G[u][i];
				if (d[e.to]>e.dist){
					d[e.to]=e.dist;
					Q.push(Edge(d[e.to],e.to));
				}
			}
		}
	}
}map;
int main(){
	scanf("%d%d",&n,&m);
	map.init(n);
	for (int i=0;i<m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		u--;v--;
		map.addedge(u,v,w);
	}
	map.prim();
	printf("%d",map.ans);
	return 0;
}


Kruskal:

#include<cstdio>
#include<algorithm>
#define maxn 10000
#define maxm 200000
using namespace std;
int n,m;
struct Kruskal{
	int u[maxm],v[maxm];
	int f[maxn];
	int n,m,ans;
	pair<int,int>e[maxm];
	void init(int n,int m){
		this->n=n;
		this->m=m;
		for (int i=0;i<m;i++){
			scanf("%d%d%d",&u[i],&v[i],&e[i].first);
			e[i].second=i;
		}
		for (int i=0;i<n;i++)f[i]=i;
	}
	int find(int x){
		return f[x]=f[x]==x?x:find(f[x]);
	}
	void kruskal(){
		sort(e,e+m);ans=0;
		for (int i=0;i<m;i++){
			int t=e[i].second;
			int x=find(u[t]),y=find(v[t]);
			if (x!=y){
				ans+=e[i].first;
				f[y]=x;
			}
		}
	}
}G;
int main(){
	scanf("%d%d",&n,&m);
	G.init(n,m);
	G.kruskal();
	printf("%d",G.ans);
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19765次
    • 积分:1720
    • 等级:
    • 排名:千里之外
    • 原创:151篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条