Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4014 Accepted Submission(s): 1193
//最小生成树、就是把已经连接的边权值设为0
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <queue>
#define N 503
using namespace std;
int map[N][N];
bool b[N];
int n;
void prim()
{
memset(b,0,sizeof(b));
b[1]=1;
int i,j,t=n,min,sum=0;
while(--t)
{ min=1000;
for(i=2;i<=n;i++)
if(!b[i]&&map[1][i]<min)
min=map[1][i],j=i;
if(min==1000) break;
b[j]=1;
sum+=min;
for(i=2;i<=n;i++)
if(!b[i]&&map[1][i]>map[j][i])
map[1][i]=map[j][i];
}
if(min==1000)
printf("-1\n");
else
printf("%d\n",sum);
}
int main()
{
int m,l,k,t,T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&l);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=1000;
while(m--)
{
scanf("%d%d%d",&i,&j,&k);
map[i][j]=map[i][j]>k?k:map[i][j];
map[j][i]=map[i][j];
}
while(l--)
{
scanf("%d%d",&t,&i);
while(--t)
{
scanf("%d",&j);
map[i][j]=map[j][i]=0;
i=j;
}
}
prim();
}
return 0;
}