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 ...
随机推荐
- what is delta simulation time
In digital logic simulation, a delta cycles are evaluation of expressions, followed by value updates ...
- A Swift Tour(4) - Objects and Classes
Objects and Classes(对象和类) 用 class 关键字后面跟一个类名来创建一个class,在一个类中声明 常亮或变量,他存在于当前类的上下文,函数的方法是同样的 var numbe ...
- iOS 项目中将 http 改成 https 后需要改动的地方(密钥验证)
这种是不验证证书的密钥 AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone] ...
- MarkDown 格式生产类型
-- 不默认换行, 真的结束, 包括格式设定,记得空一行. -- 学习参考地址如下, 讲的不好, 太复杂, 不适合新手. 有好读的更好. ** 但是江湖规矩 还是引用下吧 这是地址(http://wo ...
- Spring中Bean实例的生命周期及其行为
- javascript变量,类型 第9节
1.变量,数据类型 <html> <head> <title>变量</title> </head> <body> <h3& ...
- RD / RMDIR Command
Quote from: http://ss64.com/nt/rd.html RD Delete folder(s) Syntax RD pathname RD /S pathname RD /S / ...
- O_NONBLOCK模式下写fifo的注意事项
后台网络通信框架一般采用fifo来作为事件通知的机制:创建一个fifo,然后以非阻塞读和非阻塞写的方式打开fifo,然后把fd加到epoll里面,作为通知网络事件的fd. 在这里有个隐晦的问题容易被忽 ...
- wamp集成环境php多版本搭建(php5.5,php5.6,php7.0.6)
首先需要搭建的版本可以在php官方(http://windows.php.net/download)下载对应的版本,X86对应的是32位操作系统,X64对应的是64位操作系统. 1:下载 ...
- 转:android中APK开机自动运行
背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED.只 ...