社区讨论
WA64pts求条
P14362[CSP-S 2025] 道路修复参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhpi4alh
- 此快照首次捕获于
- 2025/11/08 07:43 4 个月前
- 此快照最后确认于
- 2025/11/08 07:43 4 个月前
做法,WA on #7,8,11,12,16,19,20,24,25,26
CPP#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e4+15;
const int M=2e6+5;
struct Edge
{
int x,y,w;
bool operator<(const Edge &a) {return w<a.w;}
}edge[M],e[N];
int n,m,k;
int c[13][N];
int fa[N],sz[N];
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;++i) scanf("%lld%lld%lld",&edge[i].x,&edge[i].y,&edge[i].w);
for(int i=1;i<=k;++i)
for(int j=0;j<=n;++j) scanf("%lld",&c[i][j]);
sort(edge+1,edge+m+1);
for(int i=1;i<=n;++i) fa[i]=i,sz[i]=1;
int cnt=0;
for(int i=1;i<=m&&cnt<n-1;++i)
{
int x=find(edge[i].x),y=find(edge[i].y);
if(x==y) continue;
if(sz[x]<sz[y]) swap(x,y);
sz[x]+=sz[y],fa[y]=x,e[++cnt]=edge[i];
}
for(int i=1;i<=k;++i)
for(int j=1;j<=n;++j)
e[++cnt]={j,n+i,c[i][j]};
sort(e+1,e+cnt+1);
int ans=4e18;
for(int i=0;i<(1<<k);++i)
{
int ansx=0,ct=0,p=n;
for(int j=1;j<=k;++j)
if((i>>j-1)&1) ansx+=c[j][0],p++;
for(int j=1;j<=p;++j) fa[j]=j,sz[j]=1;
for(int j=1;j<=cnt&&ct<p-1;++j)
{
int x=e[j].x,y=e[j].y;
if(x>n&&!((i>>x-n-1)&1)||y>n&&!((i>>y-n-1)&1)) continue;
x=find(x),y=find(y);
if(x==y) continue;
if(sz[x]<sz[y]) swap(x,y);
sz[x]+=sz[y],fa[y]=x,ansx+=e[j].w,ct++;
}
ans=min(ans,ansx);
}
printf("%lld\n",ans);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...