最小生成树(Prim算法)

来源:互联网 发布:java zip压缩并加密 编辑:程序博客网 时间:2024/05/22 00:08

/*
1 0

2 31 2 372 1 171 2 683 71 2 192 3 113 1 71 3 52 3 893 1 911 2 325 71 2 52 3 72 4 84 5 113 5 101 5 64 2 120

Sample Output

0171626*/
  #include<stdio.h>  #include<string.h>  #define N 1005  #define INF 0x3f3f3f  int cost[N][N];//结点u到v的权值  int mincost[N];//在集合S中第一个节点到N的节点的最小权值  bool s[N];//标记是结点是否加入到了集合S中  int n,m;    int Prim()  {      int i,u;      for(i=1;i<n+1;++i){         mincost[i]=INF;         s[i]=false;       }    mincost[1]=0;    int res=0;     while(true){//这个永真式可以换成一个for循环n-1次并且第一个if      int v=-1;  //要变下          for(u=1;u<n+1;++u){                if(!s[u]&&(v==-1||mincost[u]<mincost[v])){                          v=u;                   }           }         if(v==-1)break;         s[v]=true;         res+=mincost[v];       for(u=1;u<n+1;++u){            mincost[u]=mincost[u]<cost[v][u]?mincost[u]:cost[v][u];        }   }  return res;}int main(){  while(~scanf("%d",&n)&&n){        scanf("%d",&m);        memset(cost,INF,sizeof(cost));        for(int i=0;i<m;++i){           int a,b,c;           scanf("%d%d%d",&a,&b,&c);           cost[a][b]=cost[a][b]<c? cost[a][b]:c;           cost[b][a]=cost[a][b];             }         printf("%d\n",Prim());   }      return 0; }
0 0
原创粉丝点击