[tsA1491][2013中国国家集训队第二次作业]家族[并查集]
m方枚举,并查集O(1)维护,傻逼题,,被自己吓死搞成神题了。。。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 struct tri { int x,y,z; bool operator<(const tri & temp)const { return z<temp.z; } }; 6 7 int n,m,k,Sum,Ans=0x7fffffff,a[1100],Size[1100],f[1100]; 8 9 vector<tri> vec; 10 11 int get_anc(const int x) 12 { 13 return x==f[x]?x:f[x]=get_anc(f[x]); 14 } 15 16 void Union(const int x,const int y) 17 { 18 int S=get_anc(x),T=get_anc(y); 19 if(S==T)return ; 20 Sum-=a[Size[S]]+a[Size[T]]; 21 Sum+=a[Size[S]+Size[T]]; 22 Size[T]+=Size[S]; 23 f[S]=T; return ; 24 } 25 26 int main() 27 { 28 int i,j,x,y,z; 29 30 scanf("%d%d%d",&n,&m,&k); 31 for(i=1;i<=n;++i) 32 { 33 scanf("%d",&a[i]); 34 } 35 for(i=1;i<=m;++i) 36 { 37 scanf("%d%d%d",&x,&y,&z); 38 vec.push_back((tri){x,y,z}); 39 } 40 41 sort(vec.begin(),vec.end()); 42 43 for(i=0;i<m;++i) 44 { 45 for(j=1;j<=n;++j)f[j]=j,Size[j]=1; 46 Sum=n*a[1]; 47 for(j=i;j<m;++j) 48 { 49 Union(vec[j].x,vec[j].y); 50 if(Sum>=k){Ans=min(Ans,vec[j].z-vec[i].z);break;} 51 } 52 } 53 54 if(Ans!=0x7fffffff)printf("%d\n",Ans); 55 else printf("T_T\n"); 56 return 0; 57 }