70pts求解惑
查看原帖
70pts求解惑
329113
scb081111楼主2024/8/6 09:04

删去结构体内if(x.w==y.w) return x.c<y.c;就只有70pts

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1000010;
int n,m,need,fa[N],cnt_w,sum,ans;
struct node{
   int u,v,w,c;
}e[N];
bool cmp(node x,node y){
   if(x.w==y.w) return x.c<y.c; 
   return x.w<y.w;
}
int find(int x){
   if(fa[x]==x) return x;
   else{
   	fa[x]=find(fa[x]);
   	return fa[x];
   }
}
int cnt=0;
void kruskal(){
   sort(e+1,e+1+m,cmp);
   for(int i=1;i<=m;i++){
   	int ex=find(e[i].u);
   	int ey=find(e[i].v);
   	if(ex==ey) continue;
   	if(e[i].c==0) cnt_w++;
   	sum+=e[i].w;
   	fa[ex]=ey;
   	cnt++;
   	if(cnt==n-1) break;
   }
   return;
}
signed main(){
   cin>>n>>m>>need;
   for(int i=1;i<=m;i++){
   	cin>>e[i].u>>e[i].v>>e[i].w>>e[i].c;
   	e[i].u++;e[i].v++;
   }
   int l=-111,r=111;
   while(l<=r){
   	int mid=(l+r)>>1;
   	for(int i=1;i<=m;i++)
   		if(e[i].c==0) e[i].w+=mid;
   	for(int i=1;i<=n+1;i++) fa[i]=i;
   	cnt_w=0,sum=0;
   	kruskal();
   	if(cnt_w>=need){
   		l=mid+1;
   		ans=sum-need*mid;
   	}
   	else r=mid-1;
   	for(int i=1;i<=m;i++)
   		if(e[i].c==0) e[i].w-=mid;
   }
   cout<<ans<<endl;
   return 0;
}
2024/8/6 09:04
加载中...