题目链接:https://vjudge.net/problem/Aizu-2224

题目大意:

  先给出 N 个点的坐标(x,y),这N个点之间有且只有M条边,接下来给出 M 条边的两端点,每条边对应的边权就是两端点的距离,断开一条边所需的花费就是这条边的边权。现在我们要断开一些边,使得剩余的边没有办法围成圈,但又要使得总花费最小。求所需的最小花费。

解题思路:

  要是剩余的边没有办法围成圈,那么其实就是想要让剩余的边能够组成一棵树,所需的总花费其实就是除了这棵树以外的边的所有边权,所以我们让这颗树的权值最大,那么总花费(= 所有边的边权 - 树的总权值)就会最小。利用正难则反的思路,我们把这个问题转变成一道求最大生成树裸题。

  Danger ! 记得考虑重边!

  Danger!数组要开得足够大!

AC代码:

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=+;
int fa[maxn];
struct edge{
int u,v;
double cost;
}es[maxn*maxn];
struct node{
int x,y;
}cord[maxn];
bool cmp(const edge &a,const edge &b){
return a.cost>b.cost;
}
double cal(node a,node b){
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
int finds(int rt){
if(fa[rt]==rt) return rt;
return fa[rt]=finds(fa[rt]);
}
bool same(int a,int b){
return finds(a)==finds(b);
}
int main(){
int N,M;
double tot=0.0;
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++) scanf("%d%d",&cord[i].x,&cord[i].y);
for(int i=;i<M;i++){
scanf("%d%d",&es[i].u,&es[i].v);
double c=cal(cord[es[i].u],cord[es[i].v]);
es[i].cost+=c;
tot+=c;
}
sort(es,es+M,cmp);
for(int i=;i<=N;i++) fa[i]=i;
double res=0.0;
for(int i=;i<M;i++){
edge e=es[i];
if(!same(e.u,e.v)){
int t1=finds(e.u),t2=finds(e.v);
fa[t1]=t2;
res+=e.cost;
}
}
printf("%lf\n",tot-res);
return ;
}

最新文章

  1. html和html5详解
  2. owin建控制台应用程序步骤
  3. Topcoder SRM558 1000 SurroundingGame
  4. 使用my exclipse对数据库进行操作(1)
  5. [置顶] Jquery中DOM操作(详细)
  6. Linux删除文件Argument list too long问题的解决方案
  7. 简单的SqlHelper
  8. Python 3语法小记(九) 异常 Exception
  9. CSS3学习系列之字体
  10. html5小游戏基础知识
  11. linux命令和awk
  12. Meltdown攻击
  13. LeetCode(36)- Implement Stack using Queues
  14. flask基础二
  15. MySQL 设置root密码报错:mysqladmin: connect to server at &#39;localhost&#39; failed
  16. TPL DataFlow初探(二)
  17. 学习笔记25—python基本运算法则
  18. Docker的一些概念
  19. es6基础(1)--声明
  20. MVC及MVC Core在filter中如何获取控制器名称和Action名称

热门文章

  1. CTR学习笔记&amp;代码实现4-深度ctr模型 NFM/AFM
  2. 【Linux常见命令】lsof命令
  3. iOS架构入门 - MVC模式实例演示
  4. 从零开始配置webpack(基于webpack 4 和 babel 7版本)
  5. ACM及各类程序竞赛专业术语
  6. Codeforces Round #460 (Div. 2)-A Supermaket(贪心)
  7. docker overlay network
  8. ubuntu16 安装redis
  9. [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别
  10. jQuery简单竖排手风琴折叠菜单代码