POJ 2075 Tangled in Cables 最小生成树
简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并查集的代表元、
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 1000
#define MAXE 1000010
#define LEN 25
#define esp 1e-9 char name[MAXN][LEN];
int n,m; typedef struct
{
int u,v;
double w;
} EDGE; int dblcmp(double x)
{
if(fabs(x)<esp)
return ;
return x>?:-;
} int cmp(const void*i,const void*j)
{
EDGE *a=(EDGE*)i;
EDGE *b=(EDGE*)j;
return dblcmp(a->w-b->w);
} EDGE edge[MAXE];
int pre[MAXN]; int find(int x)
{
int i=x;
for(; pre[i]>=; i=pre[i]) ;
while(i!=x)
{
int t=pre[x];
pre[x]=i;
x=t;
}
return i;
} void link(int x,int y)
{
if(pre[x]>pre[y])
{
pre[x]+=pre[y];
pre[y]=x;
}
else
{
pre[y]+=pre[x];
pre[x]=y;
}
}
int p;/*记录edge数目的变量不要和输入数据的变量混用*/
void add_EDGE(int u,int v,double w)
{
edge[p].u=u;
edge[p].v=v;
edge[p].w=w;
p++;/*记得更新*/
} int match(char *s)
{
int i;
for(i=;i<n;i++)
if(strcmp(name[i],s)==)
break;
return i;
} double tot;
void input(void)
{
int i;
char s1[LEN],s2[LEN];
double w;
scanf("%lf%d",&tot,&n);
for(i=; i<n; i++)
scanf("%s",name[i]);
int u,v;
scanf("%d",&m);
for(i=; i<m; i++)
{
scanf("%s%s%lf",s1,s2,&w);
u=match(s1);
v=match(s2);
add_EDGE(u,v,w);
}
} double k(void)
{
int i,num=;
double ans=0.0;
qsort(edge,p,sizeof(EDGE),cmp);
/* for(i=0;i<p;i++)
printf("%d %d %f\n",edge[i].u,edge[i].v,edge[i].w); */
for(i=;i<p;i++)
{
int u=edge[i].u;
int v=edge[i].v;
int x,y;
if((x=find(u))!=(y=find(v)))
{
ans+=edge[i].w;
num++;
link(x,y);
}
if(num==n-)
break;
}
return ans;
} void solve(void)
{
memset(pre,-,sizeof(pre));
double mst=k();
/*printf("%lf\n",mst);*/
if(mst>tot)
puts("Not enough cable");
else printf("Need %.1f miles of cable\n",mst);
} int main(void)
{
input();
solve();
return ;
}
POJ 2075 Tangled in Cables 最小生成树的更多相关文章
- POJ 2075 Tangled in Cables (c++/java)
http://poj.org/problem?id=2075 题目大意: 给你一些人名,然后给你n条连接这些人名所拥有的房子的路,求用最小的代价求连接这些房子的花费是否满足要求. 思路: 昨天20分钟 ...
- Poj(2784),二进制枚举最小生成树
题目链接:http://poj.org/problem?id=2784 Buy or Build Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- (POJ 3026) Borg Maze 最小生成树+bfs
题目链接:http://poj.org/problem?id=3026. Description The Borg is an immensely powerful race of enhanced ...
- POJ 2395 Out of Hay(最小生成树中的最大长度)
POJ 2395 Out of Hay 本题是要求最小生成树中的最大长度, 无向边,初始化es结构体时要加倍,别忘了init(n)并查集的初始化,同时要单独标记使用过的边数, 判断ans==n-1时, ...
- poj 3026 Borg Maze (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- POJ 1789 Truck History【最小生成树简单应用】
链接: http://poj.org/problem?id=1789 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ 1679 The Unique 次最小生成树 MST
http://poj.org/problem?id=1679 题目大意: 给你一些点,判断MST(最小生成树)是否唯一. 思路: 以前做过这题,不过写的是O(n^3)的,今天学了一招O(n^2)的,哈 ...
- poj 3026 Borg Maze(最小生成树+bfs)
题目链接:http://poj.org/problem?id=3026 题意:题意就是从起点开始可以分成多组总权值就是各组经过的路程,每次到达一个‘A'点可以继续分组,但是在路上不能分组 于是就是明显 ...
- {POJ}{3925}{Minimal Ratio Tree}{最小生成树}
题意:给定完全无向图,求其中m个子节点,要求Sum(edge)/Sum(node)最小. 思路:由于N很小,枚举所有可能的子节点可能情况,然后求MST,memset()在POJ G++里面需要cstr ...
随机推荐
- 获取当前时间日期并格式化--JS
工作当中,总是遇到很多觉得不错的JS脚本.现在觉得还是找个地方记录下来,以后可以随时查看. /** *获取当前时间日期并格式化 */ function getNowDate(){ var mydate ...
- JAVA练习
JAVA基础练习 1.给java,stb,sql三门科目的成绩算出JAVA和SQL的成绩差,JAVA和SQL的成绩共是,三门课的总分是,三门课的平均分是多少 import java.util.Scan ...
- Bootstrap教程
Bootstrap 教程 Bootstrap 教程
- Quora图片懒加载
浏览quora的时候发现他的懒加载有点特别,然后就看了一下 然后等图片下载后: 就是上传图片的时候就把图片给压缩成了10X10的小图片,然后加载的时候放大价格模糊的滤镜
- cognos 10.2.2 搭建网关做负载均衡
最近要设计cognos服务器灾备模式,所以想到了cognos10自带的gateway负载均衡模式,搭建起来还是挺简洁的 设计背景: cognos主服务器:231 cognos灾备服务器:238 gat ...
- 对比iOS中的四种数据存储
来自于大牛的文章给大家分享下 :http://www.infoq.com/cn/articles/data-storage-in-ios/
- Mysql笔记【3】-SQL约束
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- Codevs 2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...
- MongoDB源码编译
MongoDB源码编译 本人编译的版本编译的版本为mongodb2.6分支,目前MongoDB3.0已经发布,编译步骤和2.6的差不多,不过3.0版本要求编译器支持c++11标准,所以如果是在Linu ...
- java输入输出流总结 转载
一.基本概念 1.1 什么是IO? IO(Input/Output)是计算机输入/输出的接口.Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是 ...