正题
题目大意
一个图每个边有不同的频率,对于大小为xxx的联通可以共享价值wxw_xwx。现在要去保留一段频率内的边,使得剩下的联通分量价值之和至少为KKK。
求最小的保留频率宽度。
解题思路
首先将频率进行排序,然后愉快的发现不满足二分性质。那么我们可以暴力枚举频段O(m2)O(m^2)O(m2)。然后每次加入一个频率的边时用并查集统计答案。
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);
}