社区讨论
求助,#1#4A了其它全WA了
P3623[APIO2008] 免费道路参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjkkimt
- 此快照首次捕获于
- 2025/11/04 04:05 4 个月前
- 此快照最后确认于
- 2025/11/04 04:05 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5,M=1e5+5;
struct Edge{int u,v,c,id;}e[M],t[M];
int n,m,k,p[N],ans[N],cnt;
int find(int x){
return p[x]==x?x:p[x]=find(p[x]);
}
bool check(int x){
for(int i=1;i<=n;i++) p[i]=i;
cnt=0;
int white=0;
sort(e+1,e+m+1,[x](Edge a,Edge b){
int wa=(!a.c)*x,wb=(!b.c)*x;
return a.c+wa<b.c+wb||(a.c+wa==b.c+wb&&a.id<b.id);
});
for(int i=1;i<=m;i++){
int fu=find(e[i].u),fv=find(e[i].v);
if(fu!=fv){
if(!e[i].c) white++;
p[fu]=fv;
ans[++cnt]=e[i].id;
if(cnt==n-1) break;
}
}
return white>=k&&cnt==n-1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
cin>>e[i].u>>e[i].v>>e[i].c;
e[i].id=i;
t[i]=e[i];
}
int l=-1e5,r=1e5,res=-1;
while(l<=r){
int mid=(l+r)>>1;
memcpy(e,t,sizeof(t));
if(check(mid)) res=mid,r=mid-1;
else l=mid+1;
}
if(res==-1){cout<<"no solution";return 0;}
memcpy(e,t,sizeof(t));
check(res);
for(int i=1;i<n;i++){
int id=ans[i];
cout<<t[id].u<<" "<<t[id].v<<" "<<t[id].c<<"\n";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...