[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 }

 

posted @ 2015-12-31 02:47  Gster  阅读(177)  评论(0编辑  收藏  举报