最小生成树 10.1.5.253 1505 poj 1258 http://poj.org/problem?id=1258

 

 

 

 

 

 

 

 

 

#include <iostream>//    poj 1258         10.1.5.253   1505
using namespace std; 
#define N 105               // 顶点的最大个数  (多写 
int a[N][N],low[N],n,ans;
int min(int x,int y)
{    return x<y?x:y;   }

void prim(int u0)             
{
    int i,j,m,k;
    ans=0;                       // 
    for (i=1;i<n;i++)  
	low[i]=a[u0][i];              //
    low[u0]=-1;
    for (i=1;i<n;i++)              //循环n-1次  依次加入n-1个顶点                    
    {
        m=1<<20;
        for (j=0;j<n;j++)           //找一个最小的的边 
            if (low[j]!=-1&&low[j]<m)
            {    m=low[j];    k=j;   }
        ans+=m;                      // 
        low[k]=-1;
        for (j=0;j<n;j++)       //
            if (low[j]!=-1)
			low[j]=min(low[j],a[k][j]);
    }
}


int main()
{
    int i,j;
    while(cin>>n&&n>=3)
    {
        for (i=0;i<n;i++)   //邻接矩阵 
        for (j=0;j<n;j++)
            cin>>a[i][j];
        prim(0);             // 从0开始 
        cout<<ans<<endl;	
    }
    return 0;
}

  

posted @ 2013-12-06 21:06  博园少主  阅读(285)  评论(0编辑  收藏  举报