http://acm.hdu.edu.cn/showproblem.php?pid=3371
此题用g++超时c++就过了,求解~~~~
以下代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct edge
{
int u,v;
int s;
edge():u(0),v(0),s(0){};
};
int p[505];
int rank[505];
bool cmp(const edge&lhs,const edge&rhs)
{
return lhs.s<rhs.s;
}
void make_set()
{
int i;
for(i=0;i<505;i++)
{
p[i]=i;
rank[i]=0;
}
}
int find_set(int i)
{
if(i!=p[i])
p[i]=find_set(p[i]);
return p[i];
}
int Union(int x,int y)
{
x=find_set(x);
y=find_set(y);
if(x==y)
return 0;
if(rank[x]<rank[y])
p[x]=y;
else
{
p[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
return 1;
}
int main()
{
int n,m,k;
int t;
scanf("%d",&t);
while(t--)
{
edge map[25005];
make_set();
scanf("%d%d%d",&n,&m,&k);
{
int i,tt;
for(i=0;i<m;i++)
scanf("%d%d%d",&map[i].u,&map[i].v,&map[i].s);
for(i=0;i<k;i++)
{
int t1,t2;
scanf("%d",&tt);
scanf("%d",&t1);
tt--;
while(tt--)
{
scanf("%d",&t2);
Union(t1,t2);
}
}
sort(map,map+m,cmp);
int sum=0;
for(i=0;i<m;i++)
{
if(Union(map[i].u,map[i].v))
sum+=map[i].s;
}
int count=0;
for(i=1;i<=n;i++)
{
if(i==p[i])
count++;
}
if(count==1)
printf("%d\n",sum);
else
printf("-1\n");
}
}
return 0;
}