最小生成树

最小生成树带判断连通  HDU1863
也是函数直接用就行

#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
#define MIN INT_MAX
#define MAX_Point 120 //最大的顶点数
#define MAX_Edge 14400   //最大的边数
int flag1=0;
double sum ;
double arr_list[MAX_Point][MAX_Point] ;
struct Edge
{
   int point ;
   double lowcost ;
   int flag;
} ;
Edge edge[MAX_Edge] ;
double prim( int n )// n表示树顶点的个数!
{
 
   int i , j , k = 1,flag ;
   double min,sum2=0 ;
   j = 1 ;
   for( i = 1 ; i< = n ; i ++ )
   {
       if (i != j )
       {
           edge[i].point = i ;
           edge[i].lowcost = arr_list[j][i] ;
           edge[i].flag=0;
       }
   }
   edge[j].lowcost = 0 ; edge[j].flag=1;
   for( i = 2 ; i< = n ; i++ )
   {
       k=1;
       min = MIN ;
       flag=0;
       for( j=2;j<=n; j++ )
       {
           if ( edge[j].flag== 0 && edge[j].lowcost < min)
           {
               k = j ;
               min = edge[j].lowcost ;
               flag=1;
           }
       }
       if (!flag) return -1;
      
            sum2 += min ;
            edge[k].flag=1;
       for(j = 2 ; j <= n ; j++ )
       {
           if( edge[j].flag== 0&&arr_list[k][j] < edge[j].lowcost)
           {
               edge[j].point = k ;
               edge[j].lowcost = arr_list[k][j] ;
           }
       }
   }
 
return sum2;
}
int main(int argc, char *argv[])
{
    double t,time_data;
    int n,m;
    int a,b;
    while(cin>>n>>m)
    {
     if (n==0) break;
     sum=0;
     for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
          arr_list[i][j]=INT_MAX;
          for(int i=1;i<=n;i++)
         {
             cin>>a>>b>>time_data;
       //下面很关键 边界数据 没有就AC 不了   
 if (time_data<arr_list[a][b])
            {
              arr_list[a][b]=time_data;                                                                            
              arr_list[b][a]=time_data;  
              }
          }
            
              sum=prim(m);          
        if (sum!=-1) //是连通的
       //cout<<sum<<endl;
       printf("%.lf\n",sum);
       else  //非连通的
       printf("?\n");        
     
      }
    //system("PAUSE");
    return EXIT_SUCCESS;
}


HDU 这方面的题很多!1102,1301,1162,1875,1233

陈宇老师写的,非常好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值