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

来源:互联网 发布:pc装机必备软件 编辑:程序博客网 时间:2024/06/08 01:16

又是最小生成树...不对着模板还是写不来尴尬

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

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

照常两种方法

prim()-15ms:

#include <cmath>#include <cstdio>#include <cfloat>#include <iostream>#include <algorithm>#define MAXN 110#define INF DBL_MAX#define LL long longusing 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 longusing 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());    }}


0 0
原创粉丝点击