• poj 1258


    题意:给n*n矩阵 表示个点个边  求最小生成树

    思路:Kruskal 算法

    //:简单介绍一下题意。农民要建立互联网络,目的使村庄里所有的农民连上网,
    //并且总费用最小。多组数据,每组数据给出一个n,然后给出n * n大小的无向图的邻接矩阵表示,值表示边权。
    //要求输出最小生成树的权值和。
    #include<iostream>
    #include<cstring>
    using namespace std;
    int map[101][101];
    int dist[101];
    int s[101];
    int n;
    void Krudkal()
    {
        int i,j;
        int sum=0;
        memset(s,0,sizeof(s));
        for(i=1;i<=n;i++)
            dist[i]=map[1][i];
        s[1]=1;
        for(i=1;i<n;i++)
        {
            int v=-1;
            int min=999999999;
            for(j=1;j<=n;j++)
                if(dist[j]<min&&!s[j])
                {
                    min=dist[j];
                    v=j;
                }
            if(v==-1) break;
            //if(min>max) max=min;
            s[v]=1;
            sum+=dist[v];
            dist[v]=0;
            for(j=1;j<=n;j++)
            {
                if(dist[j]>map[v][j])
                    dist[j]=map[v][j];
            }
        }
        cout<<sum<<endl;
    }
    int min(int x,int y)
    {
        if(x<y) return x;
        return y;
    }
    int main()
    {
        int t,i,j;
      
           while(scanf("%d",&n)!=EOF)
           {
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    scanf("%d",&map[i][j]);
                }
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    int e=min(map[i][j],map[j][i]);
                    map[i][j]=e;
                    map[j][i]=e; 
                }
            Krudkal();
        }
        return 0;
    }
  • 相关阅读:
    du熊学斐波那契I
    《博客园精华集》分类索引
    C++中指针和引用的区别
    堆和栈的区别
    getch和getchar的区别
    class和struct
    ARM开发步骤
    ARM寻址方式
    存储器映射
    思维中的错误
  • 原文地址:https://www.cnblogs.com/zhangdashuai/p/3774710.html
Copyright © 2020-2023  润新知