1 条题解
-
0陈烨鑫 (chenyexin) LV 10 @ 2023-4-24 17:09:06
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } struct node{ int u,v,w,c; }s[1000006],a[1000006]; bool cmp(node x,node y){ if(x.w==y.w) return x.c<y.c; return x.w<y.w; } int f[1000006]; int n,m; int need; int getf(int v){ if(f[v]==v) return v; return f[v]=getf(f[v]); } int ans=0; int sum=0; int solve(int x){ sum=0; int cnt=0; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++){ a[i]=s[i]; if(!a[i].c) a[i].w+=x; } sort(a+1,a+m+1,cmp); int num=0; for(int i=1;i<=m;i++){ int h1=getf(a[i].u),h2=getf(a[i].v); if(h1!=h2){ num++; f[h1]=h2; sum+=a[i].w; if(!a[i].c) cnt++; } if(num==n-1) break; } if(cnt>=need) return 1; return 0; } int main(){ n=rd(),m=rd(),need=rd(); for(int i=1;i<=m;i++){ s[i].u=rd(),s[i].v=rd(),s[i].w=rd(),s[i].c=rd(); s[i].u++; s[i].v++; } int cnt=0; int l=-106,r=106; while(l<=r){ int mid=(l+r)>>1; if(solve(mid)){ l=mid+1; ans=sum-need*mid; cnt++; } else r=mid-1; } printf("%d",ans); return 0; }
- 1
信息
- ID
- 408
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者