您的位置:首页 > 其它

hdu1162 Eddy's picture(图论:最小生成树-minimal spanning tree)

2014-07-11 19:21 489 查看
又是最小生成树...不对着模板还是写不来


计划先把数论的问题大致看下再看图论...

今天刷的一时兴起就随便做了

照常两种方法

prim()-15ms:

#include <cmath>
#include <cstdio>
#include <cfloat>
#include <iostream>
#include <algorithm>
#define MAXN 110
#define INF DBL_MAX
#define LL long long
using namespace std;

struct Point {
double x, y;
} a[MAXN];

int n;
double dis[MAXN];

double getDis(int i, int j) {
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}

double prim(void) {
int minnode, cur;
double minedge, ans = 0.0;
for(int i=0; i<n; ++i)
dis[i] = INF;

cur = 0;
for(int i=0; i<n-1; ++i) {
dis[cur] = -1.0;
minedge = INF;

for(int j=0; j<n; ++j) {
if(j!=cur && dis[j]>=0.0) {
dis[j] = min(dis[j], getDis(cur, j));
if(dis[j] < minedge) {
minnode = j;
minedge = dis[j];
}
}
//            cout << "dis[" << j << "] = " << dis[j] << endl;
//            cout << "minedge = " << minedge << endl;
}
cur = minnode;
ans += minedge;
//cout << "cur = " << cur << "minedge = " << minedge << endl;
}
return ans;
}

int main(void) {
while(scanf("%d", &n) != EOF) {
for(int i=0; i<n; ++i) {
cin >> a[i].x >> a[i].y;
}
printf("%.2f\n", prim());
}
}


Kruskal()-0ms:

#include <cmath>
#include <cstdio>
#include <cfloat>
#include <iostream>
#include <algorithm>
#define MAXN 11000
#define INF DBL_MAX
#define LL long long
using namespace std;

int u[MAXN], v[MAXN], p[MAXN], r[MAXN];
double w[MAXN];
int m, n;

struct Point {
double x, y;
} a[MAXN];

double getDis(int i, int j) {
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}

int cmp(int i, int j) {
return w[i] < w[j];
}

int find(int x) {
return p[x]==x ? x : p[x]=find(p[x]);
}

double Kruskal(void) {
double ans = 0.0;
for(int i=0; i<n; ++i)
p[i] = i;
for(int i=0; i<m; ++i)
r[i] = i;
sort(r, r+m, cmp);
for(int i=0; i<m; ++i) {
int e = r[i];
int x = find(u[e]);
int y = find(v[e]);
if(x != y) {
ans += w[e];
p[x] = y;
}
}
return ans;

}

int main(void) {
while(scanf("%d", &n) != EOF) {
for(int i=0; i<n; ++i) {
cin >> a[i].x >> a[i].y;
}
m = 0;
for(int i=0; i<n; ++i) {
for(int j=i+1; j<n; ++j) {
u[m] = i;
v[m] = j;
w[m++] = getDis(i, j);
}
}
printf("%.2f\n", Kruskal());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: