-
C - Destroy Walls
- HDU - 6187
- 题意:
- 墙全都建好了现在需要拆墙要求最小话费 可以转化为最大生成树
- 然后用总值减去最大生成树的权值即可
- 注意 有可能不存在 最大生成树。
- so:
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1020050 ll tot,n,m,u,v,w,fa[maxn],sum,temp; struct node { ll u,v,w; } edge[maxn]; bool cmp(node a,node b) { return a.w>b.w; } ll fond(ll x) { return x==fa[x]?x:fa[x]=fond(fa[x]); } void add(ll u,ll v,ll w) { edge[tot].u=u; edge[tot].v=v; edge[tot].w=w; tot++; } void kruskal(int sum) { for(int i=1; i<=maxn; i++) fa[i]=i; sort(edge,edge+tot,cmp); ll cnt=0,ans=0; for(int i=0; i<tot; i++) { ll u=edge[i].u; ll v=edge[i].v; ll w=edge[i].w; ll t1=fond(u); ll t2=fond(v); if(t1==t2)continue; ans+=w; fa[t1]=t2; cnt++; if(cnt==(n-1)) break; } ll temp=sum-ans; m-=cnt; printf("%lld %lld\n",m,temp); } int main() { while(~scanf("%lld%lld",&n,&m)) { tot=sum=0; for(int i=0; i<n; i++) scanf("%lld%lld",&u,&v); for(int i=0; i<m; i++) { scanf("%lld%lld%lld",&u,&v,&w); sum+=w; add(u,v,w); } kruskal(sum); } return 0; }
C - Destroy Walls -最大生成树
最新推荐文章于 2021-03-04 20:25:59 发布