tyvj P1307 联络员

tyvj P1307 联络员

先把必要的边连接在一起,将一条边的顶点合并在同一个集合中,从剩余的边中选择权值最少的使图连通即可。
以下是我的代码:

#include < iostream >
#define  maxn 2007
#define  maxm 10007
using   namespace  std;

typedef 
struct
{
    
long  u,v,w;
}edge;
long  n,m,cnt,num,ans,f[maxn];
edge e[maxm];

void  Qsort( long  l, long  r)
{
    
long  i = l,j = r,m = e[(l + r) / 2 ].w;
    
do {
        
while (e[i].w < m) i ++ ;
        
while (e[j].w > m) j -- ;
        
if (i <= j)
        {
            edge t
= e[i];e[i] = e[j];e[j] = t;
            i
++ ;j -- ;
        }
    }
while (i <= j);
    
if (l < j) Qsort(l,j);
    
if (i < r) Qsort(i,r);
}

long  Getf( long  x)
{
    
if (f[x] == x)  return  x;
    f[x]
= Getf(f[x]);
    
return  f[x];
}

int  main()
{
    cin
>> n >> m;
    
for ( long  i = 1 ;i <= n;i ++ ) f[i] = i;
    ans
= num = cnt = 0 ;
    
for ( long  i = 1 ;i <= m;i ++ )
    {
        
long  ra,rb,rc,rd;
        cin
>> ra >> rb >> rc >> rd;
        
if (ra == 1 )
        {
            ans
+= rd;
            
long  fx = Getf(rb),fy = Getf(rc);
            
if (fx != fy)
            {
                f[fx]
= fy;
                num
++ ;
            }
        }
        
else
        {
            cnt
++ ;
            e[cnt].u
= rb;e[cnt].v = rc;e[cnt].w = rd;
        }
    }
    
//   Input
    
    Qsort(
1 ,cnt);
    
//   Qsort
    
    
for ( long  i = num,j = 1 ;i < n - 1 ;j ++ )
    {
        
long  fx = Getf(e[j].u),fy = Getf(e[j].v);
        
if (fx != fy)
        {
            f[fx]
= fy;
            ans
+= e[j].w;
            i
++ ;
        }
    }
    
    cout
<< ans << endl;
    
return   0 ;
}

你可能感兴趣的:(tyvj P1307 联络员)