图论之最小生成树

原创 2016年05月31日 12:35:11

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

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


版权声明:本文为博主原创文章,但可以随意转载

相关文章推荐

UVa1395图论之最小生成树

//除了套模版之外还有新的思想在其中:枚举。 #include #include #include #include #include #include #include #inc...

图论之最小生成树-Agri-Net

Description Farmer John has been elected mayor of his town! One of his campaign promises was to b...

图论之最小生成树-----克鲁斯卡尔(Kruskal)算法

Kruskal算法是以边为主导地位,始终都是选择当前的可用的最小权值的边。 其主要思想为 1:设一个n个顶点的连通网络为G(V,E),最初先构造一个只有n个顶点没有边的非连通图T=(V,空集),每...

数据结构之最小生成树

  • 2014年06月08日 20:34
  • 7KB
  • 下载

hdu2489之最小生成树

Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other...

【数据结构与算法】图之最小生成树

最小生成树的基本概念      一个有n个结点的连通图的生成树是原图的极小连通子图,它包含原图中的所有n个结点,并且有保持图连通的最少的边。      如果无向连通图是一个带权图,那么它的所有生成...

畅通工程--杭电1863之最小生成树prim

畅通工程 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表...

贪心法之最小生成树之Prim算法

A,最小生成树:最小生成树在现实生活中有很多重要的应用,它要求从一个带权无向完全图G(假设有n个顶点)中选择n-1条边并使图(没有回路的树)仍然连通,同时还要求生成树的总权重最小,为了构造这样一棵树,...

贪心算法基础之最小生成树prim算法 51nod prim模板

题目:n个地点。现在给出m组地点之间的距离。 现在在这n个地点之间铺设网线,使得网线用的最少(要求每个地点都能与其他点接通)。 分析: 最小生成树,经典算法prim算法。 令集合A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图论之最小生成树
举报原因:
原因补充:

(最多只允许输入30个字)