抽象
查看原帖
抽象
723238
wukaichen888楼主2023/12/27 23:14
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5e5+5,inf=1e9;
ll t,n,m,s,k,mid,cnt,val;int fa[N];
struct edge{
	int fr,to;ll w;
	ll calc(){return w+((fr==s||to==s)?mid:0ll);}
}b[N];
bool cmp(edge x,edge y){return x.calc()<y.calc();}
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void MST(){
	sort(b+1,b+m+1,cmp);
	for(int i=1;i<=n;i++) fa[i]=i;
	cnt=val=0;
	for(int i=1,fx,fy;i<=m;i++){
		fx=find(b[i].fr),fy=find(b[i].to);
		if(fx!=fy){
			fa[fx]=fy;
			cnt+=(b[i].fr==s||b[i].to==s);
			val+=b[i].calc();
		}
	}
}
int main(){
	scanf("%lld%lld%lld%lld",&n,&m,&s,&k);
	for(int i=1;i<=m;i++)
		scanf("%d%d%lld",&b[i].fr,&b[i].to,&b[i].w);
	mid=-inf; MST();
	if(cnt<k) return puts("Impossible"),0;
	mid=inf; MST();
	if(cnt>k) return puts("Impossible"),0;
	cnt=val=mid=0;
	for(int i=1;i<=n;i++) fa[i]=i;
	ll l=-100000,r=100000;
	while(l<r){
		mid=l+r+1>>1; MST();
		if(cnt>=k) l=mid;
		else r=mid-1;
	}
	mid=l; MST();
	printf("%lld\n",val-k*mid);
	return 0;
}

非常优美,但是最后三个点会 WA

把 Impossible 的特判去了,又 AC 了,但是又没特判了

2023/12/27 23:14
加载中...