现在的位置: 首页 > 算法 > 正文

poj2395 Out of Hay , 求MST的最长边

2018年12月24日 算法 ⁄ 共 1551字 ⁄ 字号 评论关闭

点击打开链接

求MST的最长边~


prim

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std;

const int INF = 1000000000;
const int maxn = 2000 + 5;

struct pto
{
    int v, len;
};

vector<pto> G[maxn];
bool vis[maxn];
int dis[maxn];
int n, m;

int Prim()
{
    int i, j, p, ans, minc;
    memset(vis, 0, sizeof vis );
    for(i=1; i<=n; ++i) dis[i] = INF;
    dis[1] = 0;
    ans = 0;
    int maxx = -100;
    for(i=1; i<=n; ++i)
    {
        minc = INF, p = -1;
        for(j=1; j<=n; ++j) if(!vis[j])
            if(minc>dis[j]) minc = dis[p=j];
        if(-1 == p) break;
        vis[p] = 1;
        if(maxx <minc) maxx = minc;
        for(j=0; j<G[p].size(); ++j) if(!vis[G[p][j].v])
        {
            int& u = G[p][j].v;
            dis[u] = Min(dis[u], G[p][j].len);
        }
    }
    return maxx;
}




int main()
{
    int i, x, y, z;
    pto e;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0; i<=n; ++i) G[i].clear();
        for(i=0; i<m; ++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            e.v = y, e.len = z;
            G[x].push_back(e);
            e.v = x;
            G[y].push_back(e);
        }
        printf("%d\n",Prim());
    }
    return 0;
}

kruskal
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const int INF = 1000000000;
const int maxn = 2000 + 5;
const int maxm = 10000 + 5;

struct Edge {
    int x, y, w;
    Edge(int x=0, int y=0, int w=0):x(x),y(y),w(w) {}
    bool operator < (const Edge& rhs) const {
        return w < rhs.w;
    }
} e[maxm];
int fa[maxn];
int n, m;

int getfather(int x)
{
    while(x != fa[x])
        x = fa[x];
    return fa[x];
}

int kruskal()
{
    int i, t1, t2, ans = 0, num = 0;
    int maxx = -100;
    sort(e, e+m);
    for(i=1; i<=n; ++i) fa[i] = i;
    for(i=0; i<m; ++i) {
        t1 = getfather(e[i].x);
        t2 = getfather(e[i].y);
        if(t1 != t2) {
            fa[t1] = t2;
            ans += e[i].w;
            if(maxx<e[i].w) maxx = e[i].w;
            if(++num==n-1) break;
        }
    }
    return maxx;
}

int main()
{
    int i, x, y, z;
    while(~scanf("%d%d",&n,&m)) {
        for(i=0; i<m; ++i) {
            scanf("%d%d%d",&e[i].x, &e[i].y, &e[i].w);
        }
        printf("%d\n", kruskal());
    }
    return 0;
}

抱歉!评论已关闭.