链接:http://poj.org/problem?id=2075
题意:给N个城市,用电缆将所有城市连接起来。
思路:最小生成树模板题,kruskal算法的应用。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<queue> #include<stack> #include<vector> #include<ctype.h> #include<algorithm> #include<string> #define PI acos(-1.0) #define maxn 600 #define INF 1<<25 #define MAX 0x7fffffff typedef long long ll; using namespace std; string c[maxn]; int vv[maxn]; struct Road { int v,w; double l; } road[maxn*maxn]; bool cmp(Road a,Road b) { return a.l<b.l; } int findset(int x) { if(x==vv[x]) return x; return vv[x]=findset(vv[x]); } int unionset(int x,int y) { int xx=findset(x); int yy=findset(y); if(xx==yy) return 0; else if(yy>xx) { vv[yy]=xx; } else vv[xx]=yy; return 1; } int main() { double len,k,ans=0,tt=0; string x,y; int cc,rr,a,b; memset(vv,0,sizeof(vv)); scanf("%lf",&len); scanf("%d",&cc); for(int i=1; i<=cc; i++) { vv[i]=i; cin>>c[i]; } scanf("%d",&rr); for(int ii=0; ii<rr; ii++) { cin>>x>>y>>k; for(int i=1; i<=cc; i++) { if(c[i]==x) a=i; if(c[i]==y) b=i; } road[ii].v=a; road[ii].w=b; road[ii].l=k; } sort(road,road+rr,cmp); for(int i=0; i<rr; i++) { if(unionset(road[i].v,road[i].w)) { ans+=road[i].l; tt++; } if(tt==cc-1) break; } if(ans<=len) printf("Need %.1lf miles of cable\n",ans); else printf("Not enough cable\n"); }
原文:http://blog.csdn.net/ooooooooe/article/details/19258879