zoj 2966 Build The Electric System

   就是套了个prim算法就ac了

#include <stdio.h>
#include <string.h>
#define MaxInt 0x3f3f3f3f
#define N 510
/*创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问*/
int map[N][N],low[N],visited[N];
int n;
int prim()
{
    int i,j,pos,min,result=0;
    memset(visited,0,sizeof(visited));
/*从某点开始,分别标记和记录该点*/
    visited[1]=1;pos=1;
/*第一次给low数组赋值*/
    for(i=1;i<=n;i++)
        if(i!=pos) low[i]=map[pos][i];
/*再运行n-1次*/
    for(i=1;i<n;i++)
    {
/*找出最小权值并记录位置*/
     min=MaxInt;
     for(j=1;j<=n;j++)
         if(visited[j]==0&&min>low[j])
         {
             min=low[j];pos=j;
         }
/*最小权值累加*/
    result+=min;
/*标记该点*/
    visited[pos]=1;
/*更新权值*/
    for(j=1;j<=n;j++)
        if(visited[j]==0&&low[j]>map[pos][j])
            low[j]=map[pos][j];
    }
    return result;
}
 
int main()
{
    int i,v,j,ans,s,e,t,m;
       scanf("%d",&t);
       while(t--)
       {
           scanf("%d%d",&n,&m);
           /*所有权值初始化为最大*/
        memset(map,MaxInt,sizeof(map));
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&s,&e,&v);
            map[s+1][e+1]=map[e+1][s+1]=v;
        }
        ans=prim();
        printf("%d\n",ans);    
    }
    return 0;
}

 

posted @ 2014-03-30 17:35  keyboard3  阅读(181)  评论(0编辑  收藏  举报