ZOJ2326Tangled in Cables(最小生成树)
Tangled in Cables
Time Limit: 2 Seconds Memory Limit: 65536 KB
You are the owner of SmallCableCo and have purchased the franchise rights for a small town. Unfortunately, you lack enough funds to start your business properly and are relying on parts
you have found in an old warehouse you bought. Among your finds is a single spool of cable and a lot of connectors. You want to figure out whether you have enough cable to connect every house in town. You have a map of town with the distances for all the paths
you may use to run your cable between the houses. You want to calculate the shortest length of cable you must have to connect all of the houses together.
Input
Only one town will be given in an input.
- The first line gives the length of cable on the spool as a real number.
- The second line contains the number of houses, N
- The next N lines give the name of each house's owner. Each name consists of up to 20 characters {a�Cz,A�CZ,0�C9} and contains no whitespace or punctuation.
- Next line: M, number of paths between houses
- next M lines in the form
<house name A> <house name B> <distance>
Where the two house names match two different names in the list above and the distance is a positive real number. There will not be two paths between the same pair of houses.
Output
The output will consist of a single line. If there is not enough cable to connect all of the houses in the town, output
Not enough cable
If there is enough cable, then output
Need <X> miles of cable
Print X to the nearest tenth of a mile (0.1).
Sample Input
100.0
4
Jones
Smiths
Howards
Wangs
5
Jones Smiths 2.0
Jones Howards 4.2
Jones Wangs 6.7
Howards Wangs 4.0
Smiths Wangs 10.0
Sample Output
Need 10.2 miles of cable
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int start;
int end;
double cost;
}t[1001000];
int cmp(node a,node b)
{
return a.cost <b.cost ;
}
int per[11000];
int find(int x)
{
int r=x;
while(r!=per[r])
r=per[r];
return r;
}
int join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return 1;
}
return 0;
}
int main()
{
double total;
int i,n,m,j,k;
char c[10000][25],s[25],ch[25];
scanf("%lf",&total);
for(i=0;i<11000;i++)
per[i]=i;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%s",c[i]);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%s%lf",s,ch,&t[i].cost);
for(j=0;j<m;j++)
{
if(strcmp(s,c[j])==0)
t[i].start=j;
if(strcmp(ch,c[j])==0)
t[i].end =j;
}
}
sort(t,t+n,cmp);
double sum=0.0;
for(i=0;i<n;i++)
if(join(t[i].start,t[i].end))
sum=sum+t[i].cost;
if(sum>total)
printf("Not enough cable\n");
else
printf("Need %.1lf miles of cable\n",sum);
return 0;
}
用prim在杭电能过,附杭电ac代码:
<pre name="code" class="cpp">#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#define N 10000
#define M 1000000
#include <algorithm>
using namespace std;
int n, m, ncount, pre[N];
char name[N][21];
float sum_len, min_len;
struct edge
{
int x, y;
float len;
}node[M]; bool cmp(struct edge a, struct edge b)
{
return a.len < b.len;
} int search_name(char * s)
{
int i;
for(i=1; i<=n; i++)
if( !strcmp(s, name[i]) )
return i;
} void input()
{
int i, x, y;
char s[21];
scanf("%d", &n);
for(i=1; i<=n; i++)
scanf("%s", name[i]);
scanf("%d", &m);
for(i=1; i<=m; i++)
{
scanf("%s", s);
x = search_name(s);
scanf("%s", s);
y = search_name(s);
ncount++;
node[ ncount ].x = x;
node[ ncount ].y = y;
scanf("%f", &node[ ncount ].len);
}
}
int find_pre(int x)
{
while( x != pre[x] )
x = pre[x];
return x;
}
void kruskal()
{
int i, j, a, b;
for(i=1; i<=n; i++)
pre[i] = i;
sort(node+1, node+m+1, cmp);
for(i=1; i<=m; i++)
{
a = find_pre( node[i].x );
b = find_pre( node[i].y );
if( a != b )
{
min_len += node[i].len;
pre[ b ] = a;
}
}
if(sum_len < min_len)
printf("Not enough cable\n");
else
printf("Need %.1f miles of cable\n", min_len);
} int main()
{
int i;
while( scanf("%f", &sum_len) != EOF )
{
ncount = 0;
min_len = 0;
input();
kruskal();
}
return 0;
}

ZOJ2326Tangled in Cables(最小生成树)的更多相关文章
- UVALive 4872 Underground Cables 最小生成树
题目链接: 题目 Underground Cables Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %ll ...
- POJ 2075 Tangled in Cables 最小生成树
简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- poj2075
Tangled in Cables Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6348 Accepted: 2505 ...
- UvaLive 4872 Underground Cables (最小生成树)
题意: 就是裸的最小生成树(MST), 完全图, 边长是实数. 分析: 算是复习一下MST把 方法一: prim 复杂度(n^2) #include <bits/stdc++.h> usi ...
- URAL 1160 Network(最小生成树)
Network Time limit: 1.0 secondMemory limit: 64 MB Andrew is working as system administrator and is p ...
- POJ 1287 Networking (最小生成树)
Networking 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/B Description You are assigned ...
- ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法
题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...
- POJ 1287 Networking(最小生成树)
题意 给你n个点 m条边 求最小生成树的权 这是最裸的最小生成树了 #include<cstdio> #include<cstring> #include<algor ...
随机推荐
- sql 语句中的 (+) 是什么意思?
在select语句中(+)指的是外连接,是连接查询的一种方法.例:select t1.*,t2.* from dept t1,emp t2 where t1.deptno=t2.deptno(+);其 ...
- HDU 4331 Contest 4
一个很直观的想法是,求出每个点上下左右能到达的最大长度.然后枚举其斜边...没想到过了.... 当然,题解有一个很巧妙的优化,利用树状数组,那个太巧妙了. #include<iostream&g ...
- SPOJ 4491
不妨先把所有要求的素数的对的个数写出来 f(2)=u(1)G(2)+u(2)*G(2*2)+u(3)*G(2*3)+.....u(k2)*G(2*k2) f(3)=u(1)G(3)+u(2)*G(2* ...
- 关于Segmentation fault错误
今天敲代码时候出现了Segmentation fault,在网上查了一些资料,基本上的原因是.非法的内存訪问. 比如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法 ...
- BZOJ 2005 [Noi2010]能量採集 (容斥)
[Noi2010]能量採集 Time Limit: 10 Sec Memory Limit: 552 MB Submit: 2324 Solved: 1387 [id=2005"> ...
- hibernate配置数据库连接池三种用法
三种连接都是以连接MySQl为例. <!-- JDBC驱动程序 --> <property name="connection.driver_class">o ...
- JavaSE入门学习24:Java面向对象补充
一Java中的Object类 Object类是全部Java类的父类.假设一个类没有使用extendskeyword明白标识继承另外一个类,那么这个类默认 继承Object类. public class ...
- node--19 moogose demo1
db.js /** * Created by Danny on 2015/9/28 16:44. */ //引包 var mongoose = require('mongoose'); //创建数据库 ...
- bzoj2768: [JLOI2010]冠军调查(双倍经验最小割)
2768: [JLOI2010]冠军调查 题目:传送门 题解: 双倍经验(1934) 代码: #include<cstdio> #include<cstring> #inclu ...
- _itoa进制转换
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> void main() { int ...