1 条题解
-
1
#include <bits/stdc++.h> using namespace std; #define int long long const int mod=998244353; const int N=1e6+10; int n,m,k; int father[N]; int answer=1e18+10,tot; int c[N]; struct node{ int u,v,w; }a[N]; void build(){ for(int i=1;i<=n;i++){ father[i]=i; } } bool cmp(node x,node y){ return x.w<y.w; } int find(int i){ if(father[i]!=i){ father[i]=find(father[i]); } return father[i]; } void Union(int x,int y){ father[find(x)]=find(y); } bool vis[100]; void kruskal(){ build(); sort(a+1,a+m+1,cmp); for(int i=1;i<=m;i++){ int x=a[i].u; int y=a[i].v; x=find(x); y=find(y); if(x!=y){ tot++; Union(x,y); a[tot]=a[i]; } if(tot==n-1){ break; } } } void solve(){ cin>>n>>m>>k; for(int i=1;i<=m;i++){ cin>>a[i].u>>a[i].v>>a[i].w; } kruskal(); for(int i=1;i<=k;i++){ cin>>c[i]; for(int j=1;j<=n;j++){ int w; cin>>w; a[++tot]={n+i,j,w}; } } sort(a+1,a+tot+1,cmp); for(int s=0;s<(1<<k);s++){ int sum=0; int num=0; for(int i=1;i<=k;i++){ if(s>>(i-1)&1){ num++; vis[i]=1; sum+=c[i]; }else{ vis[i]=0; } } for(int i=1;i<=n+k;i++){ father[i]=i; } int to=0; for(int i=1;i<=tot;i++){ int x=a[i].u; int y=a[i].v; if(x>n&&!vis[x-n]) continue; x=find(x); y=find(y); if(x!=y){ to++; Union(x,y); sum+=a[i].w; if(to==n+num-1) break; } } answer=min(answer,sum); } cout<<answer; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T=1; //cin>>T; while(T--) solve(); return 0; }
- 1
信息
- ID
- 660
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 提高
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者