hdu 3371 Connect the Cities(并查集)
hdu 3371 Connect the Cities
http://acm.hdu.edu.cn/showproblem.php?pid=3371
Each test case starts with three integers: n, m and k. n (3 <= n <=500) stands for the number of survived cities, m (0 <= m <= 25000) stands for the number of roads you can choose to connect the cities and k (0 <= k <= 100) stands for the number of still connected cities.
To make it easy, the cities are signed from 1 to n.
Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q.
Then follow k lines, each line starts with an integer t (2 <= t <= n) stands for the number of this connected cities. Then t integers follow stands for the id of these cities.
//http://acm.hdu.edu.cn/showproblem.php?pid=3371
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 501
#define INF 999999
int parent[MAX];
struct nod
{
int x,y,q;
}node[25001];
int comp(nod a,nod b){return a.q<b.q;}
int findp(int a)
{
while(a!=parent[a])
a=parent[a];
return a;
}
int deal(nod a)
{
int x=findp(a.x);
int y=findp(a.y);
if(x!=y)
{
parent[y]=x;
return a.q;
}
return 0;
}
int main()
{
int n,m,k,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
int i,j;
for(i=1;i<=m;i++)
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].q);
for(i=1;i<=n;i++)
parent[i]=i;
int p,d,f,x,y;
for(i=1;i<=k;i++)
{
scanf("%d%d",&p,&f);
x=findp(f);
for(j=2;j<=p;j++)
{
scanf("%d",&d);
y=findp(d);
if(x!=y)
parent[y]=x;
}
}
sort(node+1,node+1+m,comp);
int sum=0,count=0;
for(i=1;i<=m;i++)
sum+=deal(node[i]);
for(i=1;i<=n;i++)
if(i==parent[i])
count++;
if(count==1)
printf("%d\n",sum);
else
printf("-1\n");
}
return 0;
}