#include<bits/stdc++.h>
using namespace std;
using LL = long long;
#define fi first
#define se second
const int N=20005,M=2000005;
int n,m,k,fa[N],cost[15],vis[15];
pair<int,pair<int,int> > e[M];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;++i)scanf("%d%d%d",&e[i].se.fi,&e[i].se.se,&e[i].fi);
    sort(e+1,e+m+1);
    for(int i=1;i<=n;++i)fa[i]=i;
    int ecnt=0;
    for(int i=1;i<=m;++i){
        int fu=find(e[i].se.fi),fv=find(e[i].se.se);
        if(fu!=fv){
            fa[fv]=fu,e[++ecnt]=e[i];
            if(ecnt==n-1)break;
        }
    }
    for(int i=1;i<=k;++i){
        scanf("%d",&cost[i]);
        for(int j=1,x;j<=n;++j)scanf("%d",&x),e[++ecnt]={x,{j,n+i}};
    }
    sort(e+1,e+ecnt+1);
    LL ans=1e18;
    for(int stat=0;stat<(1<<k);++stat){
        LL now=0;
        int num=0;
        for(int i=1;i<=k;++i){if((stat>>(i-1))&1)++num,vis[i]=1,now+=cost[i];else vis[i]=0;}
        for(int i=1;i<=n+k;++i)fa[i]=i;
        int ec=n+num-1;
        for(int i=1;i<=ecnt;++i){
            int u=e[i].se.fi,v=e[i].se.se;
            if(v>n && !vis[v-n])continue;
            int fu=find(u),fv=find(v);
            if(fu!=fv){
                fa[fv]=fu,now+=e[i].fi;
                if(!(--ec))break;
            }
        }
        if(!ec)ans=min(ans,now);
    }
    printf("%lld",ans);
}

洛谷能A。。。

1 comments

  • 1

Information

ID
40114
Time
ms
Memory
MiB
Difficulty
10
Tags
(None)
# Submissions
15
Accepted
0
Uploaded By