hdu1162 Eddy's picture(图论:最小生成树-minimal spanning tree)
2014-07-11 19:21
489 查看
又是最小生成树...不对着模板还是写不来
计划先把数论的问题大致看下再看图论...
今天刷的一时兴起就随便做了
照常两种方法
prim()-15ms:
Kruskal()-0ms:
计划先把数论的问题大致看下再看图论...
今天刷的一时兴起就随便做了
照常两种方法
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()); } }
相关文章推荐
- HDU 2489 Minimal Ratio Tree(图论-最小生成树)
- HDU 2489 Minimal Ratio Tree(数据结构-最小生成树)
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
- HDU 4408 - Minimum Spanning Tree(最小生成树计数)
- hdu 2489 Minimal Ratio Tree(枚举+最小生成树)
- HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)
- HDU 2489 Minimal Ratio Tree 最小生成树+DFS
- HDU 4408 Minimum Spanning Tree(最小生成树计数)
- HDU 2489 Minimal Ratio Tree(最小生成树)
- HDU 2489 Minimal Ratio Tree(枚举组合+最小生成树)
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
- hdu 2489 Minimal Ratio Tree 枚举+最小生成树
- HDU 4263 Red/Blue Spanning Tree【最小生成树原理】
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
- HDU 4408 Minimum Spanning Tree (图的最小生成树计数 Kruskal + Matrix_Tree定理)
- HDU 2489 Minimal Ratio Tree(数据结构-最小生成树)
- HDU 4408 Minimum Spanning Tree 最小生成树计数裸题
- HDU 1162 Eddy's picture(图论-最小生成树)
- hdu Minimal Ratio Tree(最小生成树---prim)
- HDU 2489 Minimal Ratio Tree(dfs+最小生成树)