ZOJ 2326 Tangled in Cables

来源:互联网 发布:动态演示软件 编辑:程序博客网 时间:2024/06/15 18:46

裸体最小生成树.

#include <iostream>#include <cstdio>#include <string>#include <map>#include <algorithm>using namespace std;const int maxn = 301;map<string, int> sToNum;struct edge{int u, v;double w;bool operator<(const edge & rhs)const{return w < rhs.w;}}es[maxn * maxn];double len;int id[maxn], size[maxn], n ,m;void init(int n){sToNum.clear();for (int i = 1; i <= n; ++i){id[i] = i;size[i] = 1;}}int find(int p){return p == id[p] ? p : id[p] = find(id[p]);}bool uni(int p, int q){int pq = find(p), pp = find(q);if(pp == pq)return false;if(size[pp] > size[pq]){id[pq] = pp;size[pp] += size[pq];}else{id[pp] = pq;size[pq] += size[pp];}return true;}double kruskcal(int eidx){sort(es, es + eidx);int i = 0, j = 0;double ans = 0;for (; i < eidx && j < n - 1; ++i){if(uni(es[i].u, es[i].v)){j++;ans += es[i].w;}}if(j == n -1){return ans;}else{return -1;}}int main(){while (~scanf("%lf", &len)){int eidx = 0;scanf("%d", &n);init(n);for (int i = 1; i <= n; ++i){char name[30];scanf("%s", name);sToNum[name] = i;}scanf("%d", &m);for (int i = 0; i < m; ++i){char b1[30], b2[30];double dis;scanf("%s %s %lf", b1, b2, &dis);int u = sToNum[b1], v = sToNum[b2];es[eidx].u = u, es[eidx].v = v, es[eidx++].w = dis;es[eidx].u = v, es[eidx].v = u, es[eidx++].w = dis;}double ans = kruskcal(eidx);if(ans == -1){printf("Not enough cable\n");}else{printf("Need %.1lf miles of cable\n",ans);}}return 0;}