1212 无向图最小生成树

1212 无向图最小生成树

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

收藏

关注

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

Input

第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)

Output

输出最小生成树的所有边的权值之和。

Input示例

9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8

Output示例

37

用prim算法可以完成.
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #define N 1005
 6 #define inf 0x3f3f3f3f
 7 #define mem(a) memset(a,0,sizeof(a))
 8 using namespace std;
 9 int cost[N][N];//表示两点之间的距离,不存在则设为inf
10 int mincost[N];//从x集合出发到每个顶点的最小值
11 bool used[N];//判断是否在集合中的布尔数组
12 int n,m;
13
14 int prim(){
15   for(int i=0;i<n;i++){//初始化mincost数组和used布尔数组
16     mincost[i]=inf;
17     used[i]=false;
18   }
19   mincost[0]=0;//赋给其初值
20   long long int ans=0;
21
22   while(true){
23     int v=-1;
24     //从不属于x的顶点中选取从x到其权值最小的顶点
25     for(int u=0;u<n;u++)
26       if(!used[u]&&(v==-1||mincost[u]<mincost[v]))
27         v=u;
28
29     if(v==-1)
30       break;//条件成立则说明所有的点都已经加入
31     used[v]=true;//把顶点加入
32     ans+=mincost[v];//把边的长度加到结果里
33
34     for(int u=0;u<n;u++){
35       if(!used[u])
36         mincost[u]=min(mincost[u],cost[v][u]);
37     }
38   }
39   return ans;
40 }
41 int main(){
42   cin>>n>>m;
43   int x,y,z;
44   memset(cost,inf,sizeof(cost));
45   while(m--){
46     scanf("%d%d%d",&x,&y,&z);
47     cost[--x][--y]=z;
48     cost[y][x]=z;
49   }
50   long long int k=prim();
51   cout<<k<<endl;
52   return 0;
53 }
 
时间: 2024-08-10 17:19:00

1212 无向图最小生成树的相关文章

51Nod 1212无向图最小生成树

prim #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f int G[1001][1001]; int vis[1001],lowc[1001]; int prim(int G[][1001],int n){ int i,j,p,minc,res=0; memset(vis,0,sizeof(vis));//全部初值为0表示没有访问过: vis[1]=1; for(i=2;i<=n;i++) lowc[i

51Nod-1212 无向图最小生成树

51Nod: 1212 无向图最小生成树. link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1212 1212 无向图最小生成树 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M <

51nod1212无向图最小生成树

1212 无向图最小生成树 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值.(1 <= S, E <= N,1 <= W <= 

所有边权均不相同的无向图最小生成树是唯一的证明

设G是所有边权均不相同的无向联通图. 证明一: 首先,易证图G中权值最小的边一定是最小生成树中的边.(否则最小生成树加上权值最小的边后构成一个环,去掉环中任意一条非此边则形成了另一个权值更小的生成树). 之后用反证法,假设G存在俩个不同的最小生成树 ①.设G的俩个不同的最小生成树T1 T2,设这俩颗生成树的并集为子图G1,G1为连通图且T1 T2显然为G1的最小生成树,由首先可得知俩颗生成树至少包含一条公共边,将G1中两颗生成树的公共边删去,得到子图G2.G2由一个或多个连通分量组成,其中至少有

无向图最小生成树Kruskal算法

问题 最小生成树的Kruskal算法 描述:有A.B.C.D四个点,每两个点之间的距离(无方向)是(第一个数字是两点之间距离,后面两个字母代表两个点):(1,'A','B'),(5,'A','C'),(3,'A','D'),(4,'B','C'),(2,'B','D'),(1,'C','D') 生成边长和最小的树,也就是找出一种连接方法,将各点连接起来,并且各点之间的距离和最小. 思路说明: Kruskal算法是经典的无向图最小生成树解决方法.此处列举两种python的实现方法.这两种方法均参考

无向图最小生成树Prim算法

问题 无向图最小生成树的Prim算法.一般的实现过程,采用了常规排序.本文在用Python实现中,使用了python的堆排序模块,不仅精简代码,而且提高效率. 思路说明 假设点A,B,C,D,E,F,两点之间有连线的,以及它们的距离分别是:(A-B:7);(A-D:5);(B-C:8);(B-D:9);(B-E:7);(C-E:5);(D-E:15);(D-F:6);(E-F:8);(E-G:9);(F-G:11) 关于Prim算法的计算过程,参与维基百科的词条:[普里姆算法] 将上述点与点关系

51nod1212 无向图最小生成树(Prim)

题目描述: N个点M条边的有向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值.(1 <= S, E <= N,1 <= W <= 10000) OutPut 输出最小生成树的所有边的权值之和. Input示例 9 14 1 2 4 2 3 

图论 - 无向图最小生成树

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值.(1 <= S, E <= N,1 <= W <= 10000) Output 输出最小生成树的所有边的权值之和. Input示例 9 14 1 2 4 2 3 8 3 4 

hihocoder(1097) 最小生成树Prim

图论一直是自己算法中最最最柔弱的部分,主要是,当年数据结构的课程,后面就去打酱油了,后来时间又都花在了电赛上,平时用的相关部又少,这一部分就更弱了,总是懒得捡起来,但是现在可是没退路了,开始好好复习这一部分. Prim算法是求解无向图最小生成树的经典算法,和Dijkstra算法类似,但是Prim算法每次获取一个新的顶点后,都有一个聚合的过程,而Dijkstra没有,并且Dijkstra的对象是有向图的单源最短路径,所以这两个算法起始本质上是不同的,然而他们的思想是一致的:贪心 刚好借着hihoc