• acwing 1140. 最短网络(prim)


    题目传送门

    题目描述

    农夫约翰被选为他们镇的镇长!

    他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。

    约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。

    约翰的农场的编号是1,其他农场的编号是 2∼n。

    为了使花费最少,他希望用于连接所有的农场的光纤总长度尽可能短。

    你将得到一份各农场之间连接距离的列表,你必须找出能连接所有农场并使所用光纤最短的方案。

    输入格式

    第一行包含一个整数 n,表示农场个数。

    接下来 n 行,每行包含 n 个整数,输入一个对角线上全是0的对称矩阵。
    其中第 x+1 行 y 列的整数表示连接农场 x 和农场 y 所需要的光纤长度。

    输出格式

    输出一个整数,表示所需的最小光纤长度。

    数据范围

    3≤n≤100
    每两个农场间的距离均是非负整数且不超过100000。

    输入样例:

    4
    0  4  9  21
    4  0  8  17
    9  8  0  16
    21 17 16  0
    

    输出样例:

    28
    

    Prim最小生成树

    分析

    prim算法模板题

    prim求最小生成树的原理

    • 定义一个集合用来存放已经确定的点

    • 循环n次,

      • 每次选一个到集合h距离最近的点加入集合,并且选择了该点到集合最短的这条边
      • 然后用该点去更新集合外的点到集合的距离

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm> 
    using namespace std;
    const int N = 110, INF = 0x3f3f3f3f;
    
    int g[N][N]; // 邻接矩阵表示图
    int dist[N]; // i到集合的距离
    bool st[N]; 
    int n; 
    
    int prim()
    {
    	memset(dist, 0x3f, sizeof(dist));
    	int res = 0;
    	dist[1] = 0;
    	
    	// 循环n次,每次选出一个【到集合距离最小的】点加入集合中 
    	for(int i = 0; i < n ; i++)
    	{
    		int t = -1;
    		for(int j = 1; j <= n; j++)
    			if(!st[j] && (t == -1 || dist[j] < dist[t])) // 集合外到集合距离最小的点t 
    				t = j;// 第一次选的是1
    		
    		// 第一次选的就是1这个点, 
    		if(i&&(dist[t] == INF)) return INF;
    		
    		// 第一个点到空集合的距离为0,不用加入 
    		if(i) res += dist[t];  // 最小生成树的一条边 
    		st[t] = true; // 该点进入已经发现的点的集合 
    		
    		// 用该点去更新集合外其他点到集合的距离 
    		for(int k = 1; k <= n; k++) if(!st[k]) dist[k] = min(dist[k], g[t][k]);
    	}
    	
    	return res;
     } 
     
    int main()
    {
    	scanf("%d", &n);
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= n; j++)
    			scanf("%d", &g[i][j]);
    	int res = prim();
    	printf("%d\n", res);
    	return 0;
    }
    

    时间复杂度

    参考文章

  • 相关阅读:
    use tomcat to access the file cross the environment
    data audit on hadoop fs
    Good practice release jar to Nexus
    套路!从Ruby 到 Cocoapods的发布
    单元测试之NSNull 检测
    UIwebView 和 H5交互详情
    IT 需要知道的一些专业名词和解释 (长期更新)
    Git 操作 学习资源 网址
    GCD
    软件工程——个人总结
  • 原文地址:https://www.cnblogs.com/VanHa0101/p/16014567.html
Copyright © 2020-2023  润新知