社区讨论

求助,#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 条回复,欢迎继续交流。

正在加载回复...