jzoj3301-[集训队互测2013]家族【并查集,暴力】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3301-[集训队互测2013]家族【并查集,暴力】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目大意
一個圖每個邊有不同的頻率,對于大小為xxx的聯(lián)通可以共享價值wxw_xwx?。現(xiàn)在要去保留一段頻率內(nèi)的邊,使得剩下的聯(lián)通分量價值之和至少為KKK。
求最小的保留頻率寬度。
解題思路
首先將頻率進(jìn)行排序,然后愉快的發(fā)現(xiàn)不滿足二分性質(zhì)。那么我們可以暴力枚舉頻段O(m2)O(m^2)O(m2)。然后每次加入一個頻率的邊時用并查集統(tǒng)計答案。
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=1100; struct node{int x,y,w; }a[N*10]; int n,m,K,w[N],cost,fa[N],siz[N]; long long ans=1e18; bool cmp(node x,node y) {return x.w<y.w;} int find(int x) {if(fa[x]==x) return x;return find(fa[x]); } void unionn(int x,int y) {if(x<y) fa[y]=x,siz[x]+=siz[y];else fa[x]=y,siz[y]+=siz[x]; } int main() {scanf("%d%d%d",&n,&m,&K);for(int i=1;i<=n;i++)scanf("%d",&w[i]);for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);a[i].x=x;a[i].y=y;a[i].w=z;}sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){cost=w[1]*n;for(int j=1;j<=n;j++)fa[j]=j,siz[j]=1;for(int j=i;j<=m;j++){int Fa=find(a[j].x),Fb=find(a[j].y);if(Fa==Fb) continue;cost+=w[siz[Fa]+siz[Fb]]-w[siz[Fa]]-w[siz[Fb]];unionn(Fa,Fb);if(a[j].w-a[i].w>ans) break;if(a[j].w!=a[j+1].w&&cost>=K){ans=a[j].w-a[i].w;break;}}}if(ans==1e18) printf("T_T");else printf("%d",ans); }總結(jié)
以上是生活随笔為你收集整理的jzoj3301-[集训队互测2013]家族【并查集,暴力】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 买了固态硬盘不知道如何检测如何查看电脑的
- 下一篇: jzoj3302-[集训队互测2013]