POJ 1258 Agri-Net(最小生成树)

来源:互联网 发布:网络装修平台有哪家 编辑:程序博客网 时间:2024/06/07 10:07




http://poj.org/problem?id=1258





又学到一个新的算法  最小生成树   本题用到prim算法   

题意   有N个农场  农场之间要铺设光缆  为保持通信农场之间要互相链接   问最少要多少光缆   

典型的最小生成树问题  但是 对于没有接触过最小生成树的初学者来说很容易和最短路的问题混淆  但是这里和最短路的思想并不一样 

最短路求的是到达目的地的最短路径   而这里求的是相互连通的最短距离 




AC代码:

#include <stdio.h>  #define maxinf 0x3f3f3f3f    int dis[110],vis[110];  int map[110][110];  int n;    void prim(){        int v;      for(int i=1;i<=n;i++){          dis[i]=map[1][i];          vis[i]=0;      }      vis[1]=1;      for(int i=1;i<=n;i++){          int min=maxinf;          for(int j=1;j<=n;j++)              if(!vis[j] && dis[j]<min){                  min=dis[j];                  v=j;              }          vis[v]=1;          for(int j=1;j<=n;j++)              if(!vis[j] && dis[j]>map[v][j])                  dis[j]=map[v][j];      }        }    int main(){      int i,j;      while(scanf("%d",&n)!=EOF){          for(i=1;i<=n;i++)              for(j=1;j<=n;j++)                  scanf("%d",&map[i][j]);          prim();          int sum=0;          for (int i=1;i<=n;i++){          sum+=dis[i];          }          printf ("%d\n",sum);      }      return 0;  }  



0 0
原创粉丝点击