您的位置:首页 > 其它

HDU-3371 Connect the Cities(最小生成树)

2016-07-27 01:31 399 查看
最小生成树
卡常数的水题,注意下细节就可以

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = 500 + 5;
int p[maxn],c[maxn];
struct Road{
int x,y,cost;
bool operator<(const Road& _A)const{
return cost<_A.cost;
}
}r[maxn*maxn];
int find(int x){
return p[x]==x?x:(p[x]=find(p[x]));
}
int main(){
int i,T,n,m,k,t,p1,p2,ans,cnt;
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++) p[i]=i;
for(i=0;i<m;i++) scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].cost);
sort(r,r+m);
while(k--){
scanf("%d%d",&t,&c[0]);
p1=find(c[0]);
for(i=1;i<t;i++) {
scanf("%d",&c[i]);
p2=find(c[i]);
if(p1!=p2) p[p2]=p1;
}
}
ans=0;
for(i=0;i<m;i++){
p1=find(r[i].x),p2=find(r[i].y);
if(p1!=p2) {
ans+=r[i].cost;
p[p2]=p1;
}
}
cnt=0;
for(i=1;i<=n;i++) if(find(i)==i) cnt++;
if(cnt>1) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: