您的位置:首页 > 其它

xcoj 1203 F.铺设电缆

2016-03-19 16:55 295 查看

题目描述

         Neo最近负责了合肥工业大学宣城校区的电缆铺设工程。假设现在合肥工业大学宣城校区没有任何电缆。已知合肥工业大学宣城校区一共有n个用电建筑,已经编号为1到n。其中任意两个城镇可能有一条管道供电缆铺设,也可能没有。如果两个建筑之间有管道pi,并且有一个长度si,则Neo可以在这两个建筑之间铺一条电缆线,电缆线的长度也就是这条路的长度si。

现在Neo准备了长为s的电缆线,电缆线可以任意拆断,拆断不损失任何电缆线。他需要将所有用电建筑连入电缆网络。那么,Neo能不能使用这根电缆线完成这项工作;如果能够完成,那么Neo最少耗用多长的电缆线呢?

输入

第一行一个正实数S;

第二行一个正整数n;

接下来有若干行,第i行有两个整数xi,yi和一个实数si,表示编号为xi的建筑和编号为yi的建筑之间有管道,长度为si。

输入保证xi不等于yi。

输出

      若能够完成(建立这样的电缆网络),则输出(其中<X>代表最少的电缆线长度,保留两位小数):Need <X> miles of cable
      否则输出: Impossible

样例输入

100.041 2 2.01 3 4.21 4 6.73 4 4.02 4 10.0

样例输出

Need 10.20 miles of cable

来源

宣城校区第三届程序设计竞赛

邻接矩阵会爆...

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 100007;
const int MAXM = 100007;
int F[MAXN];
struct Edge {
int u, v;
double w;
}edge[MAXM];
int tol;
void addedge(int u, int v, double w) {
edge[tol].u = u;
edge[tol].v = v;
edge[tol++].w = w;
}
bool cmp(Edge a, Edge b) {
return a.w<b.w;
}
int find(int x) {
if (F[x] == -1)return x;
else return F[x] = find(F[x]);
}
double Kruskal(int n)
{
memset(F, -1, sizeof(F));
sort(edge, edge + tol, cmp);
int cnt = 0;
double ans = 0;
for (int i = 0; i<tol; i++) {
int u = edge[i].u;
int v = edge[i].v;
double w = edge[i].w;
int t1 = find(u);
int t2 = find(v);
if (t1 != t2) {
ans += w;
F[t1] = t2;
cnt++;
}
if (cnt == n - 1)break;
}
if (cnt<n - 1)return -1;
else return ans;
}

int main() {
double su;
cin >> su;

int num;
cin >> num;

tol = 0;
int x, y;
double len;
while (cin >> x >> y >> len) {
addedge(x, y, len);

}

double ans = Kruskal(1);

if (ans != -1) {
printf("Need %.2f miles of cable\n", ans);
}
else {
printf("Impossible\n");
}
///////////
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xcoj