社区讨论
最大点为啥1.6s
P14362[CSP-S 2025] 道路修复参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjpeecde
- 此快照首次捕获于
- 2025/12/28 15:18 2 个月前
- 此快照最后确认于
- 2025/12/31 23:55 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
long long n,m,k,fa[10020],c[15],vis[15],ans;
struct edge{int u,v,w;};
edge g[1000010];//原图
vector <edge> l;//新图
void init(){for(int i=1;i<=n+k;i++)fa[i]=i;}//注意初始化到n+k
int _find(int x){return fa[x]==x?x:fa[x]=_find(fa[x]);}
void _union(int x,int y){
int fx=_find(x),fy=_find(y);
if(fx==fy) return ;
fa[fx]=fy;
}//并查集操作
bool cmp(edge x,edge y){return x.w<y.w;}
void tree(){//新图跑最小生成树
long long sum=0;
for(int i=1;i<=k;i++){if(vis[i]){sum+=c[i];}}
init();
for(int i=0;i<l.size();i++){
int u=l[i].u,v=l[i].v;
if(u>n&&!vis[u-n]) continue;
if(_find(u)==_find(v)) continue;
sum+=l[i].w;
_union(u,v);
}
ans=min(ans,sum);
return;
}
void dfs(int dep){
if(dep>k){
tree();
return;
}
dfs(dep+1);
vis[dep]=1;
dfs(dep+1);
vis[dep]=0;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);//这个要加 不加会爆
cin>>n>>m>>k;
init();
for(int i=1;i<=m;i++){cin>>g[i].u>>g[i].v>>g[i].w;}
sort(g+1,g+m+1,cmp);
for(int i=1;i<=m;i++){//原图跑最小生成树
int u=g[i].u,v=g[i].v;
if(_find(u)==_find(v)) continue;
_union(u,v);
ans+=g[i].w;
l.push_back(g[i]);
}
for(int j=1;j<=k;j++){//新边
cin>>c[j];
for(int i=1;i<=n;i++){
int w;
cin>>w;
l.push_back({j+n,i,w});//村庄节点编号是n+j
}
}
sort(l.begin(),l.end(),cmp);//提前排序
dfs(1);
cout<<ans;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...