HDU 3371 Connect the Cities 【kruskal】


点击打开链接


题意:  给你n个城市让你花最小代价连起来,但是给你了几个已经连好的城市。



我上来怼了一发prim 超时,我就想,kruskal 应该可以,最后没时间敲,,,gg


直接kruskal 模板就能过。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int inf=0xffffff;
const int maxn=505;
struct node{
    int u,v,w;
    bool operator <(const node &a)const{
        return w<a.w;
    }
}edge[maxn*maxn];
int n,m,w,T,cnt,t;
int fa[maxn];
int dis[maxn];
void addedge(int x,int y,int val){
    edge[++cnt].u=x;
    edge[cnt].v=y;
    edge[cnt].w=val;
}
int Find(int x){
    if(fa[x]==-1) return x;
    return fa[x]=Find(fa[x]);
}
int kruskal(int n){
    int ans=0;
    for(int i=1;i<=cnt;++i){
        int u=edge[i].u;
        int v=edge[i].v;
        int w=edge[i].w;
        int t1=Find(u);
        int t2=Find(v);
        if(t1!=t2){
            ans+=w;
            fa[t1]=t2;
            t++;
        }
        if(t==n) break;
    }
    if(t<n) return -1;
    else return ans;
}
int main(){
    int a,b,c,q;
    scanf("%d",&T);
    while(T--){
        cnt=0;t=1;
        memset(fa,-1,sizeof(fa));
        scanf("%d %d %d",&n,&m,&w);
        while(m--){
            scanf("%d %d %d",&a,&b,&c);
            addedge(a,b,c);
            addedge(b,a,c);
        }
        sort(edge+1,edge+1+cnt);
        while(w--){
            scanf("%d",&q);
            for(int i=0;i<q;++i){
                scanf("%d",&a);
                if(!i) b=a;
                else {
                    int t1=Find(a),t2=Find(b);
                    if(t1!=t2) fa[t1]=t2,t++;
                    b=a;
                }
            }
        }
        int ans=kruskal(n);
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值