poj 2421

题目描述:http://poj.org/problem?id=2421

prim最小生成树

将题目中的存放图的数组值置为-1

当a,b已经建好时,将map[a][b]=0;map[b][a]=0;(map是存放图的数组)

代码:

#include <stdio.h>
#include <stdlib.h>
int map[150][150],road[150],k;
int key[150],sum;

short flag[150];
void prim(int r,int n)
{
    int i,j,min;
    for(i=1;i<=n;i++)
    {
        key[i]=10001;
        flag[i]=0;
    }
    key[r]=0;
  
    for(i=1;i<=n;i++)
    {
        min=-1;
        for(j=1;j<=n;j++)
        {
            
            
           if(flag[j]!=1&&(key[min]>key[j]||min==-1))
           {
               min=j;
           }
        }
        flag[min]=1;
        sum+=key[min];
        for(j=1;j<=n;j++)
        {
            if(flag[j]!=1&&map[min][j]!=-1&&key[j]>map[min][j])
            {
                key[j]=map[min][j];
            }
        }
    }
}
int main(int argc, char** argv){

    int n,m,i,j,a,b;
        scanf("%d",&n);
        memset(map,-1,sizeof(map));
        sum=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
            scanf("%d",&map[i][j]);
            }
            
        }
         
            scanf("%d",&m);
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                map[a][b]=0;
                map[b][a]=0;
            }
            prim(n,n);
       
            printf("%d\n",sum);
    
    return (EXIT_SUCCESS);
}
posted @ 2012-04-16 15:39  枫月寒  阅读(228)  评论(0编辑  收藏  举报