poj 1258 简单的prim算法运用

来源:互联网 发布:ug编程入门 编辑:程序博客网 时间:2024/05/07 16:47
题意:村长有一个农田接了高速网络 , 他想把网络通过接到其他农田 , 下面给出n个农田 , 每个农田到其他农田的距离 ,要求所需网线的最短距离 ?

很明显这是一个简单的最小生成树问题:

代码:

#include
#include
#include
using namespace std;

#define maxn 1000000

int grap[110][110];
int n;

int prim()
{
    int i , j ,p[110];
    intpre[100];
    memset(pre ,0 , sizeof(pre));
    pre[0] =1;
    for(i = 0; i< n; i++)
       p[i] =maxn;
    int x = 0 ,sum = 0;
    for(j = 0; j< n-1; j++)
    {
      int  y = x ;
       int maxx =maxn;
       for(i = 0; i< n; i++) //对于更新每个点的最小值 , 和找所有点之间的最小值 , 可以写在同一个for循环中
       {
          if(!pre[i]&& grap[y][i] < p[i])
             p[i] =grap[y][i];
          if(!pre[i]&& p[i] < maxx)
          {
             maxx =p[i];
             x = i;
          }
       }
       pre[x] =1;
       sum +=maxx;
    }
    returnsum;
}

int main()
{
   while(scanf("%d" , &n) != EOF)
    {
      
       int i ,j;
       for(i = 0; i< n; i++)
          for(j = 0; j< n; j++)
             scanf("%d" ,&grap[i][j]);
      cout<<prim()<<endl;
    }
    return0;
}
0 0
原创粉丝点击