标签:hdu1162 eddys picture prim kruskal 最小生成树
3 1.0 1.0 2.0 2.0 2.0 4.0
3.41
#include <stdio.h> #include <math.h> #include <string.h> #define MAX 110 #define INF 1000000000 struct Point{ double x,y; }; double graph[MAX][MAX] ; double prim(int n) { bool visited[MAX]; memset(visited,false,sizeof(visited)); double lowcost[MAX] ; int closest[MAX] ; for(int i = 0 ; i < n ; ++i) { lowcost[i] = graph[0][i] ; closest[i] = 0 ; } lowcost[0] = 0.0 ; visited[0] = false ; for(int i = 0 ; i < n ; ++i) { int min = INF , index = 0 ; for(int j = 0 ; j < n ; ++j) { if(!visited[j] && lowcost[j]<min) { index = j ; min = lowcost[j] ; } } visited[index] = true ; for(int j = 0 ; j < n ; ++j) { if(!visited[j] && lowcost[j]>graph[index][j]) { lowcost[j] = graph[index][j] ; closest[j] = index ; } } } double sum = 0.0 ; for(int i = 1 ; i < n ; ++i) { sum += lowcost[i] ; } return sum ; } double distance(const Point &a ,const Point &b) { double x = a.x-b.x , y = a.y-b.y ; return sqrt(x*x+y*y); } int main() { Point p[MAX]; int n ; while(~scanf("%d",&n)) { for(int i = 0 ; i < n ; ++i) { scanf("%lf%lf",&p[i].x,&p[i].y) ; } for(int i = 0 ; i < n ; ++i) { for(int j = 0 ; j <= i ; ++j) { graph[i][j] = graph[j][i] = distance(p[i],p[j]) ; } } double sum = prim(n) ; printf("%.2lf\n",sum) ; } return 0 ; }
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define MAX 110 #define INF 1000000000 using namespace std ; struct Point{ double x,y; }; struct Edge{ int x , y ; double w ; }edge[MAX*MAX]; bool cmp(const Edge &a ,const Edge &b) { return a.w<b.w ; } int f[MAX] ; void init() { for(int i = 0 ; i < MAX ; ++i) { f[i] = i ; } } int find(int x) { int r = x ; while(r != f[r]) { r = f[r] ; } int temp ; while(x != f[x]) { temp = f[x] ; f[x] = r ; x = temp ; } return r; } double kruskal(int m ,int n) { sort(edge,edge+m,cmp) ; double lowcost[MAX] ; int index = 0 ; init() ; for(int i = 0 ; i < m ; ++i) { int fx = find(edge[i].x) , fy = find(edge[i].y) ; if(fx != fy) { lowcost[index++] = edge[i].w ; f[fx] = fy ; } } double sum = 0 ; for(int i = 0 ; i < n-1 ; ++i) { sum += lowcost[i] ; } return sum ; } double dis(const Point &a ,const Point &b) { double x = a.x-b.x , y = a.y-b.y ; return sqrt(x*x+y*y); } int main() { Point p[MAX]; int n ; while(~scanf("%d",&n)) { for(int i = 0 ; i < n ; ++i) { scanf("%lf%lf",&p[i].x,&p[i].y) ; } int index = 0 ; for(int i = 0 ; i < n ; ++i) { for(int j = 0 ; j <= i ; ++j) { edge[index].x = i , edge[index].y = j ; edge[index].w = dis(p[i],p[j]) ; index++ ; } } double sum = kruskal(index , n) ; printf("%.2lf\n",sum) ; } return 0 ; }
hdu 1162 Eddy's picture 最小生成树入门题 Prim+Kruskal两种算法AC
标签:hdu1162 eddys picture prim kruskal 最小生成树
原文地址:http://blog.csdn.net/lionel_d/article/details/43907315