社区讨论
24分,其它点WA,TLE,蹲一个大佬帮调
P14362[CSP-S 2025] 道路修复参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhqm5dd6
- 此快照首次捕获于
- 2025/11/09 02:23 4 个月前
- 此快照最后确认于
- 2025/11/16 14:06 4 个月前
CPP
#include <bits/stdc++.h>
#define endl '\n'
#define maxm 1000005
#define int long long
#define inf 0x7f7f7f7f
#define maxn 10005
#define maxk 12
using namespace std;
struct node
{
int u;
int v;
int w;
}e[maxm],g[maxn*2];
int n,m,k,ans;
int a[maxk][maxn];
int c[maxk];
int fa[maxn+maxk];
inline bool cmp(node x,node y)
{
return x.w<y.w;
}
inline int find(int x)
{
if (fa[x]==x) return fa[x];
else return fa[x]=find(fa[x]);
}
inline void uni(int x,int y)
{
int fx=find(x);
int fy=find(y);
if (fx==fy) return;
fa[fx]=fy;
}
int tot=0;
inline void kruskal()
{
for (int i=1;i<=m;i++)
{
if (find(e[i].u)==find(e[i].v)) continue;
uni(e[i].u,e[i].v);
g[++tot]=e[i];
}
}
inline int solve(node p[],int s)
{
int tmp=0;
int cnt=0;
int qzq=0;
node r[maxm];
for (int i=0;i<k;i++)
{
if ((s>>i)&1)
{
++cnt;
for (int j=1;j<=n;j++)
r[++qzq]={n+cnt,j,a[i+1][j]};
tmp+=c[i+1];
}
}
sort(r+1,r+qzq+1,cmp);
node v[2*maxn]={0};
node *ed=merge(p+1,p+tot+1,r+1,r+qzq+1,v+1,cmp);
for (node *it=&v[1];it!=ed;it++)
{
if (find(it->u)==find(it->v)) continue;
uni(it->u,it->v);
tmp+=it->w;
}
return tmp;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for (int i=1;i<=m;i++)
{
int x,y,z;
cin >> x >> y >> z;
e[i]={x,y,z};
}
sort(e+1,e+m+1,cmp);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=k;i++)
{
cin >> c[i];
for (int j=1;j<=n;j++) cin >> a[i][j];
}
kruskal();
ans=inf;
for (int s=0;s<(1<<k);s++)
{
for (int i=1;i<=n+k;i++) fa[i]=i;
ans=min(ans,solve(g,s));
}
cout << ans <<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...