AOJ - 2224 Save your cat(最小生成树)
2015-05-18 20:23
344 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45524
NY在自己的花园里养了很多猫。有一天,一个巫婆在N个点设置了魔法,然后有M条关系,每一条在两个点之间有栅栏。
NY需要损坏这些栅栏但是需要栅栏长度这么多神奇的水,因为这种水很昂贵所以希望水用的越少越好。输出最少花费。
输入N,M表示N个点,接下来N行每行一个点的坐标,接下来M行每行两个数表示x,y之间有栅栏相连。
没有栅栏会交叉,每个圈都至少有一只猫。
题目意思就是如果图产生了圈就要把一些边去掉,破坏这个圈,问需要破坏的边的最小长度。
那么每次并查集的时候只要判断在同一个连通分量那么就需要破坏掉这条边,累加即可。因为不会有重边,所以
按边的权值从大到小或者从小到大都可以。
NY在自己的花园里养了很多猫。有一天,一个巫婆在N个点设置了魔法,然后有M条关系,每一条在两个点之间有栅栏。
NY需要损坏这些栅栏但是需要栅栏长度这么多神奇的水,因为这种水很昂贵所以希望水用的越少越好。输出最少花费。
输入N,M表示N个点,接下来N行每行一个点的坐标,接下来M行每行两个数表示x,y之间有栅栏相连。
没有栅栏会交叉,每个圈都至少有一只猫。
题目意思就是如果图产生了圈就要把一些边去掉,破坏这个圈,问需要破坏的边的最小长度。
那么每次并查集的时候只要判断在同一个连通分量那么就需要破坏掉这条边,累加即可。因为不会有重边,所以
按边的权值从大到小或者从小到大都可以。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; struct node { int x,y,id; }; struct edge { int u,v; double cost; edge() {} edge(int x,int y,double z) { u=x; v=y; cost=z; } bool operator <(const edge& a) const { return cost>a.cost; } }; edge es[50010]; int par[10010]; node p[10010]; int n,m; void init() { for(int i=1;i<=n;i++) par[i]=i; } int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x!=y) par[x]=y; } double dis(int a,int b) { return sqrt(1.0*(p[a].x-p[b].x)*(p[a].x-p[b].x)+1.0*(p[a].y-p[b].y)*(p[a].y-p[b].y)); } double kruskal() { sort(es,es+m); //for(int i=0;i<m;i++) printf("%d %d %lf\n",es[i].u,es[i].v,es[i].cost); double s=0; for(int i=0;i<m;i++) { edge e=es[i]; if(find(e.u)!=find(e.v)) { unite(e.u,e.v); } else { s+=e.cost; } } return s; } int main() { //freopen("a.txt","r",stdin); int a,b; double c,sum; while(~scanf("%d%d",&n,&m)) { init(); sum=0; for(int i=1;i<=n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); c=dis(a,b); es[i]=edge(a,b,c); } printf("%.3lf\n",kruskal()); } return 0; }
相关文章推荐
- AOJ 2224 Save your cat (kruskal求最大生成森林)
- AOJ 2224 Save your cats(最小生成树)
- 最小生成树 aoj 2224 Save your cats
- AOJ - 2224 Save your cat (最大生成树,Kruskal)
- Save your cats Aizu - 2224 最小生成树
- EOJ 3201/AOJ 2224 Save your cats【Kruskal】
- Save your cats Aizu - 2224 有环图使他变成无环图去边之和最小
- AOJ 2224 Save your cats (Kruskal)
- AIZU 2224 Save your cat
- Aizu 2224 Save your cats【最大生成树】
- Save your cats Aizu - 2224(并查集求最大生成树)
- Aizu:2224-Save your cats
- Aizu 2224 Save your cats【最大生成树】
- AOJ 2224 Save your cat
- Aizu 2224 Save your cats【最大生成树】
- 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher(迪杰斯特拉乱用) H.老子的全排列呢(dfs)
- Save your cats Aizu - 2224
- Aizu 2224 Save your cats(最大生成树)
- Highways(prim——最小生成树)
- poj 3723 Kruskal最小生成树