1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<bits/stdc++.h> using namespace std;
void read(int &x) { x=0;char c; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); }
struct edge { int s,t,c,_c,col; void ad(int cc){if(!col)_c=c+cc;} }e[100005]; bool operator < (edge e1,edge e2){return ((e1._c==e2._c)?(e1.col<e2.col):(e1._c<e2._c));}
int fa[100005]; int root(int u) { if(!fa[u])return u; return (fa[u]=root(fa[u])); } void merge(int u,int v){fa[root(u)]=root(v);}
int n,m,nd;
int chk(int x) { for(int i=1;i<=m;i++)e[i].ad(x); sort(e+1,e+1+m); memset(fa,0,sizeof(fa)); int l=n-1,i=1,ret=0; while(l) { while(root(e[i].s)==root(e[i].t))i++; ret+=e[i].col^1; merge(e[i].s,e[i].t);++i,--l; } return ret; }
int binary(int l,int r,int val) { int mid,tmp; while(l<=r) { mid=l+r>>1; tmp=chk(mid); if(tmp<nd)r=mid-1; else l=mid+1; } return r; }
int main() { read(n),read(m),read(nd); for(int i=1;i<=m;i++)read(e[i].s),read(e[i].t),e[i].s++,e[i].t++,read(e[i].c),read(e[i].col),e[i]._c=e[i].c; int cc=binary(-100,100,nd); for(int i=1;i<=m;i++)e[i].ad(cc); sort(e+1,e+1+m); memset(fa,0,sizeof(fa)); int l=n-1,i=1,ans=0; while(l) { while(root(e[i].s)==root(e[i].t))i++; ans+=e[i]._c; merge(e[i].s,e[i].t);++i,--l; } ans-=cc*nd; printf("%d",ans); return 0; }
|