标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 6348 | Accepted: 2505 |
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
POJ2075 Tangled in Cables 最小生成树
题目大意:
给你一些人名,然后给你n条连接这些人名所拥有的房子的路,求用最小的代价求连接这些房子的花费是否满足要求。
#include<cstdio> #include<cstring> #include<string> #include<map> #include<algorithm> #include<iostream> using namespace std; #define N 15010 map<string,int>ad; struct node{ int x,y; double v; node(int x=0,int y=0,double v=0):x(x),y(y),v(v){} }e[N]; int n,m,fa[N];double money; int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } bool cmp(const node &a,const node &b){ return a.v<b.v; } int main(){ freopen("sh.in","r",stdin); scanf("%lf%d",&money,&n); for(int i=1;i<=n;i++){ char str[60]; scanf("%s",str); ad[str]=i; } scanf("%d",&m); for(int i=1;i<=m;i++){ char c1[60],c2[60]; double cost; scanf("%s %s %lf",c1,c2,&cost); e[i].x=ad[c1]; e[i].y=ad[c2]; e[i].v=cost; } sort(e+1,e+m+1,cmp); double ans=0;int k=0; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int fx=find(e[i].x),fy=find(e[i].y); if(fx!=fy){ fa[fy]=fx; ans+=e[i].v; k++; } if(k==n-1) break; } if(money>ans) printf("Need %.1lf miles of cable\n",ans); else printf("Not enough cable\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5630189.html