记录编号 437453 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2012] tree(陈立杰) 最终得分 100
用户昵称 Gravatar하루Kiev 是否通过 通过
代码语言 C++ 运行时间 1.168 s
提交时间 2017-08-14 10:23:34 内存使用 4.89 MiB
显示代码纯文本
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 100005
using namespace std;
int v,ei,m,n,zz,s,t,c,col,ans;
int dad[2*maxn];
struct node{
	   int fro,to,next,v,col;
	   bool operator<(node A)const{
	   	    return (v==A.v)?col<A.col:v<A.v;
	   }
}e[2*maxn];
int find(int x){
    if(dad[x]==x) return x;
    return dad[x]=find(dad[x]);
}
int check(int x){ 
	 for(int i=1;i<=ei;i++)
	     if(e[i].col==0) e[i].v+=x;
	 sort(e+1,e+1+ei);
     for(int i=1;i<=v;i++) dad[i]=i;
     int sum=0,tot=0,has=0,ret;
     for(int i=1;i<=ei;i++){
	     int xx=find(e[i].fro);
	     int yy=find(e[i].to);
	     if(xx!=yy){
	        dad[yy]=xx;
	        tot++;
	        has+=1-e[i].col;
	        sum+=e[i].v;
	        if(tot==v-1){
	           if(has>=n) {ans=sum-n*x;ret=true;}
	           else ret=false;
	        }
		}
    }
    for(int i=1;i<=ei;i++)
        if(e[i].col==0) e[i].v-=x;
	return ret;
} 
int main(){
	freopen("nt2012_tree.in","r",stdin);
	freopen("nt2012_tree.out","w",stdout);
	scanf("%d%d%d",&v,&ei,&n);
	int l=0,r=0;
	for(int i=1;i<=ei;i++){
	    scanf("%d%d%d%d",&s,&t,&c,&col);
	    e[i].fro=s+1;
	    e[i].to=t+1;
	    e[i].v=c;
	    e[i].col=col;
	}
	l=-101;r=101;
	while(l<r){
		  //cout<<l<<" "<<r<<endl;
	      int mid=(l+r)>>1;
	      if(check(mid+1)) l=mid+1;
	      else r=mid;
	}printf("%d",ans);
}