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;
}

 

posted @ 2014-06-07 13:50  _一千零一夜  阅读(161)  评论(0编辑  收藏  举报