• poj2485&&poj2395 kruskal


    题意:最小生成树的最大边最小,sort从小到大即可

    poj2485

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define maxn 505
    int map[maxn][maxn],pa[150000],num,n;
    struct node
    {
        int x;
        int y;
        int val;
    }s[150000];
    bool cmp(node a,node b)
    {
        return a.val<b.val;
    }
    void init()
    {
        int i,j;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                scanf("%d",&map[i][j]);
        for(i=1;i<=n;i++)
            pa[i]=i;
    }
    void makemap()
    {
        int i,j;
        num=0;
        for(i=1;i<=n;i++)
            for(j=i+1;j<=n;j++)
            {
                s[num].x=i;s[num].y=j;s[num++].val=map[i][j];
            }
    }
    int find(int x)
    {
        if(x!=pa[x])
            pa[x]=find(pa[x]);
        return pa[x];
    }
    void kruskal()
    {
        int i,j,ans=0;
        sort(s,s+num,cmp);
        for(i=0;i<num;i++)
        {
            int l1,l2;
            l1=find(s[i].x);l2=find(s[i].y);
            if(l1!=l2)
            {
                pa[l1]=l2;
                ans=s[i].val;
            }
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            init();
            makemap();
            kruskal();
        }
        return 0;
    }

     poj2395

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define maxn 2002
    int pa[maxn],num,n;
    struct node
    {
        int x;
        int y;
        int val;
    }s[10010];
    bool cmp(node a,node b)
    {
        return a.val<b.val;
    }
    void init()
    {
        int i;
        for(i=0;i<=n;i++)
            pa[i]=i;
    }
    int find(int x)
    {
        if(x!=pa[x])
            pa[x]=find(pa[x]);
        return pa[x];
    }
    void kruskal()
    {
        int i,j,ans=0;
        sort(s,s+num,cmp);
        for(i=0;i<num;i++)
        {
            int l1,l2;
            l1=find(s[i].x);l2=find(s[i].y);
            if(l1!=l2)
            {
                pa[l1]=l2;
                ans=s[i].val;
            }
        }
        printf("%d
    ",ans);
    }
    int main()
    {
        int i,j;
        while(scanf("%d%d",&n,&num)!=EOF)
        {
            init();
            for(i=0;i<num;i++)
                scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].val);
            kruskal();
        }
        return 0;
    }
  • 相关阅读:
    详解Oracle安装与配置.
    如何做大规模软件的配置管理
    关于软件权限设置的一点心得体会
    使用RDLC报表(一)
    详细解析Linux scp命令的应用
    spring propertyplaceholderconfigurer
    hibernate ehcache
    由Eclipse内存不足谈谈JVM内存
    事务策略: API 层策略
    什么叫控制反转(IoC )
  • 原文地址:https://www.cnblogs.com/sweat123/p/4681916.html
Copyright © 2020-2023  润新知