P1258 By kruskal

P1258 By kruskal

kruskal..
/**/ /*
Kruskal
*/

#include 
< iostream >
using   namespace  std;

const   int  MAXN = 101 ;
const   int  INF = 0x7fffffff ;
int  n;
struct  node
{
       
int x,y;
       
int value;
}
;
node edge[MAXN
* MAXN + 1 ];
bool  hash[MAXN];
int  dist[MAXN];
int  father[MAXN];
int  len;
void  sort( int  l, int  r)
{
     
int ll=l,rr=r,mid=edge[(l+r)/2].value;
     
while(ll<=rr)
     
{
      
while (edge[ll].value<mid) ll++;
      
while (edge[rr].value>mid) rr--;
      
if (ll<=rr)
      
{
       swap(edge[ll],edge[rr]);
       ll
++;
       rr
--;
      }

     }

     
if (ll<r) sort(ll,r);
     
if (rr>l) sort(l,rr);
}

int  getFather( int  x)
{
    
if (x==father[x]) return x;
    father[x]
=getFather(father[x]);
    x
=father[x];
    
return x;
}

void  kruskal()
{
     sort(
1,len);
     
for (int i=0;i<n;i++)
         father[i]
=i;
     
int ans=0;
     
for (int i=1;i<=len;i++)
     
{
         
int fx=getFather(edge[i].x);
         
int fy=getFather(edge[i].y);
         
if (fx!=fy)
         
{
          ans
+=edge[i].value;
          father[fx]
=fy;
         }

     }

     cout
<<ans<<endl;
}


int  main()
{
    
while(cin>>n)
    
{
     len
=0;
     
for (int i=0;i<n;i++)
      
for (int j=0;j<n;j++)
      
{
          
int x;    
          cin
>>x;
          
if (i==j) continue;
          node p;
          p.x
=i;p.y=j;p.value=x;
          edge[
++len]=p;
      }

     kruskal();
    }

    
    
return 0;
}

你可能感兴趣的:(P1258 By kruskal)