poj 2485 Highways(kruscal or prim最小生成树)

来源:互联网 发布:js搅拌机型号 编辑:程序博客网 时间:2024/04/27 17:44

题意是求最小生成树中的最大边。


来人。。。上模板。。。


kruscal代码:(612k...235ms)

#include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 501;int n, p;int fa[MaxN];struct edge{    int x, y, w;    bool operator<(const edge &b)const    {        return w < b.w;    }}e[MaxN * MaxN];int find(int x){    if(fa[x] != x)        fa[x] = find(fa[x]);    return fa[x];}int kruscal(){    int res = -1;    sort(e, e + p);    for(int i = 0; i < n; i++)        fa[i] = i;    for(int i = 0; i < p; i++)    {        int t1 = find(e[i].x);        int t2 = find(e[i].y);        if(t1 != t2)        {            fa[t2] = t1;            res = max(res, e[i].w);        }    }    return res;}int main(){    int ncases;    scanf("%d", &ncases);    while(ncases--)    {        scanf("%d", &n);        p = 0;        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d", &e[p].w);                e[p].x = i;                e[p].y = j;                p++;            }        }        int ans = kruscal();        printf("%d\n", ans);    }    return 0;}

prim代码:(528k...172ms)

#include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 501;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n;int prim(){    bool vis[MaxN];    int dis[MaxN];    int res = -1;    for(int i = 1; i <= n; i++)    {        vis[i] = false;        dis[i] = INF;    }    dis[1] = 0;    vis[1] = true;    int mark = 1;    for(int i = 1; i < n ; i++)    {        for(int j = 1; j <= n; j++)        {            if(!vis[j] && dis[j] > g[mark][j])            {                dis[j] = g[mark][j];            }        }        int mindis = INF;        for(int j = 1; j <= n; j++)        {            if(!vis[j] && mindis > dis[j])            {                mindis = dis[j];                mark = j;            }        }        vis[mark] = true;        res = max(res, dis[mark]);    }    return res;}int main(){    int ncases;    scanf("%d", &ncases);    while(ncases--)    {        scanf("%d", &n);        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d", &g[i][j]);            }        }        int ans = prim();        printf("%d\n", ans);    }    return 0;}


0 0
原创粉丝点击