#include<stdio.h>
#define maxv 501
#define maxcost 1002
int g[ maxv][ maxv];
int lian[ maxv];
int n, m;
void prim( int v)
{
int vert[ maxv];
int cost[ maxv];
int min, i, j, k;
int sum;
for ( i= 1 ; i<= n; i++)
{
vert[ i]= v;
cost[ i]= g[ v][ i];
}
vert[ v]= 0 ;
for ( i= 2 ; i<= n; i++)
{
min= maxcost; k= v;
for ( j= 2 ; j<= n; j++)
{
if ( vert[ j]!= 0 && min>= cost[ j])
{
k= j;
min= cost[ j];
}
}
vert[ k]= 0 ;
for ( j= 2 ; j<= n; j++)
{
if ( cost[ j]> g[ k][ j]&& vert[ j]!= 0 )
{
vert[ j]= k;
cost[ j]= g[ k][ j];
}
}
}
int h= 0 ;
for ( i= 2 ; i<= n; i++)
if ( cost[ i]>= maxcost)
{
h= 1 ;
printf( "-1/n" );
break ;
}
if ( h!= 1 )
{
sum= 0 ;
for ( i= 1 ; i<= n; i++)
sum+= cost[ i];
printf( "%d/n" , sum);
}
// for(i=1;i<=n;i++)
// printf("%d ",cost[i]);
}
main ()
{
int t, i, j, p;
int a, b, c, k, r;
scanf( "%d" ,& t);
for ( p= 0 ; p< t; p++)
{
scanf( "%d%d%d" ,& n,& m,& k);
for ( i= 1 ; i<= n; i++)
{
for ( j= 1 ; j<= n; j++)
g[ i][ j]= maxcost;
g[ i][ i]= 0 ;
}
for ( i= 0 ; i< m; i++)
{
scanf( "%d%d%d" ,& a,& b,& c);
if ( c< g[ a][ b])
{
g[ a][ b]= c;
g[ b][ a]= c;
}
}
for ( i= 0 ; i< k; i++)
{
scanf( "%d" ,& r);
for ( j= 0 ; j< r; j++)
scanf( "%d" ,& lian[ j]);
for ( a= 0 ; a< r- 1 ; a++)
{
g[ lian[ a]][ lian[ a+ 1 ]]= 0 ;
g[ lian[ a+ 1 ]][ lian[ a]]= 0 ;
}
// for(b=a+1;b<r;b++)
// {
// g[lian[b]][lian[a]]=0;
// }
}
prim( 1 );
}
}
hdu3371——Connect the Cities
最新推荐文章于 2022-02-25 19:38:17 发布