/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年09月03日 星期一 20时33分13秒
> Description:HDU3371
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50000
int n,m,k;
struct node
{
int a,b;
int val;
bool operator < (node com) const
{
return val<com.val;
}
}E[N];
int par[N];
int find_par(int x)
{
return x==par[x]?x:par[x]=find_par(par[x]);
}
void unite(int x, int y)
{
int fx=find_par(x);
int fy=find_par(y);
par[fy]=fx;
}
void init()
{
for (int i=0; i<=n; i++)
par[i]=i;
for (int i=0; i<m; i++)
scanf("%d%d%d",&E[i].a,&E[i].b,&E[i].val);
sort(E,E+m);
for (int i=0; i<k; i++)
{
int t,x,y;
scanf("%d%d",&t,&x);
t--;
while (t--)
{
scanf("%d",&y);
unite(x,y);
}
}
}
void kruskal()
{
int sum=0;
for (int i=0; i<m; i++)
{
if (find_par(E[i].a)!=find_par(E[i].b))
{
unite(E[i].a,E[i].b);
sum+=E[i].val;
}
}
int flag=0;
for (int i=1; i<=n; i++)
if (par[i]==i)
flag++;
if (flag>1)//判断是否都连通,如果连通分量大于1,则没有连通
sum=-1;
printf("%d\n",sum);
}
int main()
{
int t;
while (~scanf("%d",&t))
{
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
init();
kruskal();
}
}
return 0;
}
HDU3371,kruskal算法
最新推荐文章于 2024-08-10 16:49:10 发布