只WA on hack#2求助
查看原帖
只WA on hack#2求助
275860
___A__楼主2024/7/25 09:56
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,M=5e5+5;
int n,m,s,k,p[N];
struct edge{
    int u,v,w;
}a[M];
int cmp(edge x,edge y){
    if(x.w!=y.w){
        return x.w<y.w;
    }
    return (x.u==s||x.v==s)>(y.u==s||y.v==s);
}
int find(int x){
    if(p[x]==x){
        return x;
    }
    return p[x]=find(p[x]);
}
void merge(int u,int v){
    p[find(u)]=find(v);
}
pair<int,int>calc(int mid){
    for(int i=1;i<=m;i++){
        if(a[i].u==s||a[i].v==s){
            a[i].w+=mid;
        }
    }
    for(int i=1;i<=n;i++){
        p[i]=i;
    }
    int sum=0,cnt=0;
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++){
        if(find(a[i].u)!=find(a[i].v)){
            merge(a[i].u,a[i].v),sum+=a[i].w,cnt+=(a[i].u==s||a[i].v==s);
        }
    }
    for(int i=1;i<=m;i++){
        if(a[i].u==s||a[i].v==s){
            a[i].w-=mid;
        }
    }
    for(int i=1;i<=n;i++){
    	if(find(i)!=find(1)){
    		cnt=-1;
		}
	}
    return {sum,cnt};
}
int main(){
    cin>>n>>m>>s>>k;
    for(int i=1;i<=m;i++){
        cin>>a[i].u>>a[i].v>>a[i].w;
    }
    int l=-3e4,r=3e4,ans=-1;
    while(l<=r){
        int mid=(l+r)>>1;
        if(calc(mid).second>=k){
            l=mid+1,ans=calc(mid).first-mid*k;
        }
        else{
            r=mid-1;
        }
    }
    if(ans==-1){
        cout<<"Impossible";
    }
    else{
        cout<<ans;
    }
}
2024/7/25 09:56
加载中...