2020多校hdu A Total Eclipse hdu6763

2020多校hdu A Total Eclipse hdu6763

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6763

开始想到的是对每个联通块里,全部b[i]都减去最小的值,然后去掉最小值的点,原来的联通块就分成多个联通块。再找下一个联通块操作。

这样就很难实现,于是想着反过来,从大到小依次放入一个集合中(实际上这个集合也不需要用容器存),对每个点x都遍历一遍和他相连的所有边(x,y),如果y已经在集合中,而且x,y还没有用并查集合并,就合并他们,并且ans+=b[y]-b[x]。

最后在把最后根的值加到ans。

因为如果按之前的想法,每次联通块减最小值,而这样做可以保证并查集的根一直是最小值。(下面数字表示权值)假如这时并查集的根为1连接着2和3,2和3并不相连,按题目意思,我们可以全部减1。那么在1分别和2,3合并的时候,因为以后不再有根是2和3变成0,所以在1分别和2,3合并的时候,ans+=b[y]-b[x]。

代码;

#include<iostream>
#include
<algorithm> #include<cstring> #include<cstdio> #include<sstream> #include<vector> #include<stack> #include<deque> #include<cmath> #include<map> #include<queue> #include<bitset> #define sd(x) scanf("%d",&x) #define ms(x,y) memset(x,y,sizeof x) #define fu(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define all(a) a.begin(),a.end() using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn=1e5+79; const int mod=1e9; const int mod2=1e5+7; const ll INF=1e18+7; struct od { int num,pos; bool operator<(const od &a) const { return num>a.num; } }a[maxn]; int fa[maxn],n,m,w[maxn]; vector<int> to[maxn]; bool used[maxn]; ll ans=0; int find(int x) { if(x==fa[x]) return x; else return fa[x]=find(fa[x]); } void Union(int x,int y) { y=find(y); //x=find(x); //这句加不加都可以,因为进行操作的时候,x都是作为最小的,根一直是它自己 ans+=w[y]-w[x]; //printf("%d-%d=\n",w[y],w[x]); fa[y]=x; } ll solve() { fu(i,1,n) { int u=a[i].pos; used[u]=1; if(to[u].empty()) continue; fu(j,0,to[u].size()-1) { int v=to[u][j]; if(!used[v]||find(u)==find(v)) continue;v Union(u,v); //printf("link:%d-%d\n",u,v); } } fu(i,1,n) if(i==fa[i]) ans+=w[i]; //最后加上根的权值,因为最后的根还没有计算 return ans; } int main() { int T; cin>>T; while(T--) { sd(n);sd(m); fu(i,1,n) { sd(a[i].num); a[i].pos=i,w[i]=a[i].num; fa[i]=i; to[i].clear(); } fu(i,1,m) { int u,v; sd(u);sd(v); to[u].push_back(v); to[v].push_back(u); } sort(a+1,a+n+1); ms(used,0); ans=0; printf("%lld\n",solve()); } return 0; }
/* 1 5 6 4 2 5 1 1 1 2 2 3 3 4 2 4 4 5 3 5 ans:7 */

猜你喜欢

转载自www.cnblogs.com/studyshare777/p/13373553.html