一个最小生成树的题目,用并查集判连通。地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1679

#include <stdio.h>
#include 
<stdlib.h>

const int LEN = 105;

struct
{
    
int b;
    
int e;
    
int len;
    
int flag;
}
seg[LEN*LEN];

int cmp ( const void *a, const void *b )
{

    
return *( ( int * )a + 2 ) - *( ( int * )b + 2 );
}


int p[LEN];

void make ( int n )
{

    
for ( int i=0; i<n; i++ )
    
{
        p[i] 
= -1;
    }

}


int find ( int a )
{

    
if ( p[a] < 0 )
    
{
        
return a;
    }


    
int r = find ( p[a] );
    p[a] 
= r;

    
return r;
}


void un ( int a, int b )
{

    
int ra = find ( a );
    
int rb = find ( b );

    
if ( p[ra] < p[rb] )
    
{
        p[ra] 
+= p[rb];
        p[rb] 
= ra;
    }

    
else
    
{
        p[rb] 
+= p[ra];
        p[ra] 
= rb;
    }

}


int temp[LEN];
int pt;
int data[LEN];
int pd;

int kul ( int n, int m, int *ans )
{

    
*ans = 0;
    pt 
= 0;
    make ( n );
    
for ( int i=0; i<m; i++ )
    
{
        
if ( seg[i].flag )
        
{
            seg[i].flag 
= 0;
            
continue;
        }

        
if ( find ( seg[i].b ) != find ( seg[i].e ) )
        
{
            un ( seg[i].b, seg[i].e );
            
*ans = *ans + seg[i].len;
            temp[pt
++= i;
        }

    }


    
int r = find ( 0 );
    
for ( i=1; i<n; i++ )
    
{
        
if ( find ( i ) != r )
        
{
            
break;
        }

    }

    
if ( i < n )
    
{
        
return 0;
    }

    
return 1;
}


int main ()
{

    
int t;
    
int n, m;
    
int b, e, len;

    scanf ( 
"%d"&t );
    
while ( t -- )
    
{
        scanf ( 
"%d%d"&n, &m );
        
for ( int i=0; i<m; i++ )
        
{
            scanf ( 
"%d%d%d" , &b, &e, &len );
            seg[i].b 
= b-1;
            seg[i].e 
= e-1;
            seg[i].len 
= len;
            seg[i].flag 
= 0;
        }


        qsort ( seg, m, sizeof ( seg[
0] ), cmp );

        
int min;
        kul ( n, m, 
&min );

        
for ( i=0; i<pt; i++ )
        
{
            data[i] 
= temp[i];
        }

        pd 
= pt;

        
for ( i=0; i<pd; i++ )
        
{
            
int temp;
            seg[ data[i] ].flag 
= 1;
            
if ( kul ( n, m, &temp ) )
            
{
                
if ( temp == min )
                
{
                    
break;
                }

            }

        }


        
if ( i >= pd )
        
{
            printf ( 
"%d\n", min );
        }

        
else
        
{
            printf ( 
"Not Unique!\n" );
        }

    }

    
return 0;
}