• poj_1258 prim最小生成树


    题目大意

        给定N个点,以及每两个点之间的路径长度,求出一个连接这N个点的方案,使得连接这N个点的总长度最短,求出该总长度。

    题目分析

        求最小生成树MST的模板题,直接使用prim算法进行求解。

    实现(c++)

    #include<stdio.h>
    #include<vector>
    #include<queue>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define MAX_NODE 105
    
    struct Edge{
    	int vertex;
    	int dist;
    	Edge(int v, int d) :
    		vertex(v), dist(d){};
    };
    vector<vector<Edge> > gGraph;
    struct Compare{
    	bool operator()(const Edge& e1, const Edge& e2){
    		return e1.dist > e2.dist;
    	}
    };
    
    bool gVisited[MAX_NODE];
    
    int Prim(int n){	//prim算法加堆优化
    	memset(gVisited, false, sizeof(gVisited));
    	//随便选择一个起点,假设从0开始
    	Edge e(0, 0);
    	int sum_mst = 0;
    	priority_queue<Edge, vector<Edge>, Compare> pq;
    	pq.push(e);
    	while (!pq.empty()){
    		e = pq.top();
    		pq.pop();
    		if (gVisited[e.vertex])
    			continue;
    		gVisited[e.vertex] = true;
    		sum_mst += e.dist;
    		for (int i = 0; i < gGraph[e.vertex].size(); i++){	//将该点连接边都加入到优先队列中,进行下一轮选择
    			pq.push(gGraph[e.vertex][i]);
    		}
    	}
    	return sum_mst;
    }
    
    int main(){
    	int n, dist;
    	while (scanf("%d", &n) != EOF){
    		gGraph.clear();
    		gGraph.resize(n);
    		for (int i = 0; i < n; i++){
    			for (int j = 0; j < n; j++){
    				scanf("%d", &dist);
    				gGraph[i].push_back(Edge(j, dist));
    			}
    		}
    		int result = Prim(n);
    		printf("%d
    ", result);
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何在js中使用递归
    基于angular写的一个todolist
    使用github参与开源项目
    用sass写栅格系统
    Activity返回按钮
    Listview优化MovieListAdapter的使用
    [强悍]listview下拉刷新,上拉加载更多组件版
    Google自己的下拉刷新组件SwipeRefreshLayout
    当ListView有Header时,onItemClick里的position不正确
    tabhost练习,剥离自“去哪儿”
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4867362.html
Copyright © 2020-2023  润新知