HDOJ 1233 HDU 1233 还是畅通工程 ACM 1233 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址:
         http://acm.hdu.edu.cn/showproblem.php?pid=1233
题目描述:
还是畅通工程

Time Limit: 
4000 / 2000  MS (Java / Others)    Memory Limit:  65536 / 32768  K (Java / Others)
Total Submission(s): 
6742     Accepted Submission(s):  3087


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
 

Sample Output
3
5

题目分析:
最小生成树的问题.  --->  用 prim 或者 kruskal 算法求解, 我是用的kruskal算法.

按边的值做非降序排列, 然后从小到大对每条边一次判断, 如果2个顶点未全部访问或者不在同一个集合,那么加上这条边.直到最后一条边. 
这道题目不用判断图的联通性,  直接输出最后已选则的边的总和即可.

代码如下:
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include 
< iostream >
#include 
< algorithm >
using   namespace  std;
typedef 
struct  {
     
int  parent;
     
int  height;   
}Tset;  

typedef 
struct  treeUFS{
       
public :
              treeUFS(
int  n  =   0 ):N(n + 1 ) {  set   =   new  Tset[N];
                                          visited 
=   new   bool [N]; 
                                          
for  (  int  i  =   0 ; i  !=  N;  ++  i) 
                                          
set [i].parent  =  i, set [i].height  =   1 ,visited[i]  =   false
                                        }
              
~ treeUFS(){ delete []  set ; };
              
int  find (  int  x ){   int  r  =  x;   while  ( r  !=   set [r].parent ) r  =   set [r].parent;
                                   
return  r;
                                }
              
void  setVisit (  int  x,  int  y ) { visited[x]  =  visited[y]  =   true ; } 
              
bool  getVisit (  int  x ) {  return  visited[x]; }
              
void  Merge(  int  x, int  y ){  x  =  find ( x );  y  =  find ( y );  
                                           
if  ( x  ==  y )  return ;
                                           
if  (  set [x].height  ==   set [y].height ){
                                                
set [y].parent  =  x;
                                                
set [x].height  ++ ;
                                           }
                                           
else   if  (  set [x].height  <   set [y].height ) {
                                                     
set [x].parent  =  y;       
                                                   }
                                           
else {    set [y].parent  =  x;
                                               }
                                        }
       
private :
              Tset 
* set ;
              
bool   * visited;
              
int  N;         
}treeUFS; 
typedef 
struct  edge {
       
int  v1,v2;
       
int  wei;     
}EDGE;
EDGE edge[
5005 ];
bool  cmp ( EDGE A, EDGE B )
{
     
return  A.wei  <  B.wei; 
}
int  main ()
{
    
int  N;
    
while  ( scanf (  " %d " , & N ) , N )
    {
            
int  n  =  N  *  ( N  -   1  )  /   2 ;     
            
int  v1,v2;
            memset ( edge, 
0  ,  sizeof  ( edge ) );
            treeUFS UFS ( N ); 
            
for  (  int  i  =   1 ; i  <=  n;  ++  i ) 
            {
                  scanf ( 
" %d%d " & edge[i].v1, & edge[i].v2 );
                  scanf ( 
" %d " & edge[i].wei );
            } 
            sort ( edge 
+   1 , edge  +  n  +   1 , cmp );
            
int  sum  =   0 ;
            
for  (  int  i  =   1 ; i  <=  n;  ++  i )
            {
                  
if  ( (  ! UFS.getVisit(edge[i].v1)  ||   ! UFS.getVisit(edge[i].v2) )  ||  UFS.find(edge[i].v1)  !=  UFS.find(edge[i].v2) )
                  {
                        UFS.setVisit ( edge[i].v1, edge[i].v2 );
                        UFS.Merge ( edge[i].v1, edge[i].v2 );
                        sum 
+=  edge[i].wei;
                  }        
            }
            printf ( 
" %d\n " ,sum );
    }
    
return   0
}

你可能感兴趣的:(ACM)