| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 6039 | Accepted: 2386 |
Description
Input
Output
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
Source
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
int const MAX = 1e4;
int fa[MAX];
int re[MAX];
int n, m;
map<string, int> mp;
struct Edge
{
int u, v;
double w;
}e[MAX];
bool cmp(Edge a, Edge b)
{
return a.w < b.w;
}
void UF_set()
{
for(int i = 0; i < MAX; i++)
fa[i] = i;
}
int Find(int x)
{
return x == fa[x] ? x : fa[x] = Find(fa[x]);
}
void Union(int a, int b)
{
int r1 = Find(a);
int r2 = Find(b);
if(r1 != r2)
fa[r2] =r1;
}
double Kruskal()
{
UF_set();
int num = 0;
double res = 0;
for(int i = 0; i < m; i++)
{
int u = e[i].u;
int v = e[i].v;
if(Find(u) != Find(v))
{
Union(u, v);
res += e[i].w;
num ++;
}
if(num >= n - 1)
break;
}
return res;
}
int main()
{
string s, s1, s2;
double val, sum, ans = 0;
scanf("%lf", &sum);
int cnt = 1;
mp.clear();
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
cin >> s;
if(!mp[s])
mp[s] = cnt ++;
}
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
cin >> s1 >> s2 >> val;
e[i].u = mp[s1];
e[i].v = mp[s2];
e[i].w = val;
}
sort(e, e + m, cmp);
ans = Kruskal();
if(ans < sum)
printf("Need %.1f miles of cable\n", ans);
else
printf("Not enough cable\n");
}POJ 2075 Tangled in Cables (kruskal算法 MST + map)
原文地址:http://blog.csdn.net/tc_to_top/article/details/44318245