关闭

图论之最小生成树

155人阅读 评论(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
查看评论

[SDUT](3362)数据结构实验之图论六:村村通公路 ---最小生成树(图)

数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 当前农村公路建设正如火如荼的展开,某...
  • m0_37624640
  • m0_37624640
  • 2017-08-10 19:43
  • 459

图论(一)最小生成树

最小生成树有两种算法:这里不讲 1:普利姆算法(prim) 2:
  • wangxin110000
  • wangxin110000
  • 2014-05-07 21:10
  • 554

图论九——最小生成树(prim)

数据结构实验之图论九:最小生成树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可...
  • qq_36525906
  • qq_36525906
  • 2017-11-22 15:13
  • 319

图论中最小生成树的问题学习

之前的博客分析过这种问题,并使用伪代码分析过其实现。 首先给出问题背景吧,其实岛屿问题(华为的机试题),要在n个岛屿上之间建桥,要使得所有岛屿联通,因为岛屿之前的距离不一样,所以规划出最短的造桥路径。 为了方便研究,从最简单的三个节点开始 ABC三个岛屿,两两之间的距离如上图。 首先要将...
  • u010442328
  • u010442328
  • 2015-08-17 14:57
  • 527

数据结构之最小生成树

最小生成树: 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。这种构造连通网的最小代价生成树称为最小生成树,详见数据结构之图(术语、存储结构、遍历)。 求连通网的最小生成树有两种经典方法:普里姆(Prime)算法和克鲁斯卡尔(Kruskal)算法。 1、P...
  • u013071074
  • u013071074
  • 2014-06-09 15:13
  • 1568

图论-带权图的最小生成树(Prim)算法

算法设计:Prim算法从顶点开始着手。 从一个顶点开始,然后放入到树的集合中,然后重复做如下事情:     (1)、找最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中,把这些放入优先级队列。     (2)、找到权值最小的边把它...
  • cdl2008sky
  • cdl2008sky
  • 2011-11-19 11:21
  • 4070

hdu 4463 Outlets(图论:最小生成树)

典型的zuixiaoshengchengs
  • u011639256
  • u011639256
  • 2014-11-11 17:25
  • 272

图论 用prim法求最小生成树

我用的是邻接矩阵保存的图 测试数据二所用的图如下: 具体说明都在下面这段代码里(如果不嫌弃可以仔细阅读) #include #include #include #include #define inf 65535 #include typedef struct Graph ...
  • m0_37667021
  • m0_37667021
  • 2017-07-29 16:46
  • 134

数据结构实验之图论三:判断可达性(DFS算法)

#include using namespace std; int s[1010][1010], vist[1010], n; void create(int m) {     int u, v;     while(m--)     { ...
  • huluwadeyeye
  • huluwadeyeye
  • 2017-11-21 20:26
  • 585

最小生成树,普里姆算法(Python实现)

普里姆算法的基本思想:普里姆算法是另一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。
  • HeiSeDiWei
  • HeiSeDiWei
  • 2015-12-16 13:46
  • 4232
    个人资料
    • 访问:46768次
    • 积分:2105
    • 等级:
    • 排名:千里之外
    • 原创:163篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    最新评论