• HDU1301(最小生成树)


    大意:给定一个图,求能连接所有点的最少权值和。

    分析:最小生成树Prim算法。一般用于顶点较少,边较多的稠密图。

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    const int INF = 1 << 30;
    int map[27][27];//map存图
    int d[27];//记录每2个点间的最小权值
    bool visit[27];//记录点是否访问
    int main()
    {
    	int  m, n, minn, temp, sum;
    	char ch;
    	//freopen("F:in.txt", "r", stdin);
    	while (~scanf("%d", &n) && n)
    	{
    		memset(map,0x1f,sizeof(map));
    		memset(d, 0, sizeof(d));
    		memset(visit, 1, sizeof(visit));
    		for (int i = 1; i < n; i++)
    		{
    			getchar();
    			scanf("%c", &ch);
    			scanf("%d", &m);
    			for (int j = 1; j <= m; j++)
    			{
    				scanf("%c", &ch);
    				scanf("%c", &ch);
    				scanf("%d", &temp);
    				map[i - 1][ch - 'A'] = temp;
    				map[ch - 'A'][i - 1] = temp;
    			}
    		}
    		for (int i = 1; i < n; i++)
    			d[i] = map[i][0];//初始化第一个点到剩下点的距离
    		sum = 0;
    		visit[0] = 0;
    		for (int i = 1; i < n; i++)
    		{
    			minn = INF;
    			for(int j=0;j<n;j++)
    				if (visit[j] && d[j] < minn)
    				{
    					minn = d[j];
    					temp = j;
    				}////找出最小权值并记录位置
    			visit[temp] = 0;
    			sum += minn;
    			for (int j = 0; j < n; j++)
    			{
    				if (visit[j] && d[j] > map[j][temp])//更新权值
    					d[j] = map[j][temp];
    			}
    		}
    		printf("%d
    ", sum);
    	}
    	return 0;
    }
    

  • 相关阅读:
    动态代理模式
    AutoFac在非Web项目中使用
    解释器模式 字符串解析
    命令模式
    TerminateThread
    mysql update datetime类型==为空和字符串转换细节记录
    正则表达式 std
    LP
    解决 Maven ‘parent.relativePath‘ of POM
    如何从Linux中删除以前版本的.NET Core(CentOS 7.1)
  • 原文地址:https://www.cnblogs.com/nickqiao/p/7583383.html
Copyright © 2020-2023  润新知