萌新求助
查看原帖
萌新求助
268385
the_xin楼主2021/2/16 16:09

不知道怎么wa了

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e6;
struct Edges{
	int u,v,val,com;
	bool operator <(const Edges & a)const{
		if(val!=a.val)
		return val<a.val; 
		else return com<a.com;
	}
}edges[N];
int p[N],n,m,k;
void init(){
	for(int i=0;i<=n;i++){
		p[i]=i;
	}
}
int find(int x){
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}
int ans=0;
bool check(int mid){
	init();
	for(int i=1;i<=m;i++){
		if(edges[i].com==0){
			edges[i].val+=mid;
		}
	}
	sort(edges+1,edges+1+m);
	int cnt=0;
	ans=0;
	for(int i=1;i<=m;i++){
		int u=find(edges[i].u),v=find(edges[i].v);
		if(edges[i].com==0){
			edges[i].val-=mid;
		}
		if(u!=v){
			ans+=edges[i].val;
			p[u]=v;
			if(edges[i].com==0){
				cnt++;
			}
		}
	}
	return cnt>=k;
}

int main(){
	int Tcnt=0;
	while(~scanf("%d%d%d",&n,&m,&k)){
		for(int i=1;i<=m;i++){
			int u,v,w,com;
			scanf("%d%d%d%d",&u,&v,&w,&com);
			edges[i]={u,v,w,com};
		}
		int l=-100,r=100;
		while(l<=r){
			int mid=(l+r)/2;
			if(check(mid))l=mid+1;
			else r=mid-1;
		}
		printf("Case %d: %d\n",++Tcnt,ans);
	}
	return 0;
}

2021/2/16 16:09
加载中...