还是畅通工程1233

/*

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16025    Accepted Submission(s): 7250
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最小的公路总长度。
 
Sample Input
 
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0

*/

#include<iostream>

using namespace std;

#define INF 0x3f3f3ff

const int MAX_V_NUM=105;

int Edges[MAX_V_NUM][MAX_V_NUM];

struct Node{

         int adjvex;//存储该边依附在U中的顶点

         int lowcost;//边的权值,访问标记

}closedge[MAX_V_NUM];

int prim(int u,int n)

{

         int i,j,k,min,sum=0;

         for(i=1;i<=n;i++)

         {

                   closedge[i].adjvex=u;

                   closedge[i].lowcost=Edges[u][i];

         }

         closedge[u].lowcost=-1;

         for(i=1;i<n;i++)

         {

                   min=INF;

                   for(j=1;j<=n;j++)

                            if(closedge[j].lowcost!=-1&&closedge[j].lowcost<min)

                            {

                                     min=closedge[j].lowcost;

                                     k=j;

                            }

                            //cout<<"("<<closedge[k].adjvex<<","<<k<<","<<min<<")"<<endl;

                            sum+=min;

                            closedge[k].lowcost=-1;

                            for(j=1;j<=n;j++)//修改其他顶点的最小边

                            {

                                     if(Edges[k][j]!=0&&Edges[k][j]<closedge[j].lowcost)

                                     {

                                               closedge[j].adjvex=k;

                                               closedge[j].lowcost=Edges[k][j];

                                     }

                            }       

         }

         cout<<sum<<endl;

         return 0;

}

int main()

{

         int n,i,j,u,v,w;

         while(true)

         {

                   cin>>n;

                   if(n==0)

                            break;

                   for(i=1;i<=n;i++)

                            for(j=1;j<=n;j++)

                            {

                                     if(i==j)

                                               Edges[i][j]=0;

                                     else

                                               Edges[i][j]=INF;

                            }

                            for(i=1;i<=(n*(n-1))/2;i++)

                            {

                                     cin>>u>>v>>w;

                                     Edges[u][v]=Edges[v][u]=w;

                            }

                            prim(1,n);

         }

         return 0;

}

 

 

 

posted @ 2012-11-27 17:15  ♂咱說 ろ算  阅读(159)  评论(0编辑  收藏  举报