标签:break find scan 限制 logs 内存 超出 nbsp 分享
热带岛屿Lagrishan的首领现在面临一个问题:几年前,一批外援资金被用于维护村落之间的道路,但日益繁茂的丛林无情的侵蚀着村民的道路,导致道路维修开销巨大,长老会不得不放弃部分道路的维护。上图左侧图显示的是正在使用道路的简图以及每条路每个月的维修费用(单位为aacms)。现在长老会需要提出一种方案,即需要保证村落之间都可以互相到达,又要将每个月的道路维修费用控制在最小。村子编号为从A到I。上图右侧显示的方案最小维修开销为216 aacms每月。
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
216 30
keuskal最小生成树
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 300; int father[N];int n; int find(int x) { if(father[x]!=x)father[x]=find(father[x]); return father[x]; } int num=0; struct node{ int x, y,w; bool operator < (const node &a)const{ return w<a.w; } }edge[N*N]; void add_edge(int x,int y,int w) { edge[++num].x=x,edge[num].y=y,edge[num].w=w; } void kruskal() { sort(edge+1,edge+num+1); int cnt=0,ans=0; for(int i=1;i<=num;i++) { int fx=find(edge[i].x),fy=find(edge[i].y); if(fx!=fy) { father[fx]=father[fy]; cnt++; ans+=edge[i].w; } if(cnt==n-1)break; } printf("%d\n",ans); return; } int main() { int a; char q[10]; while(11101001) { memset(father,0,sizeof(father)); memset(edge,0,sizeof(edge)); scanf("%d",&n); if(n==0) break; num=0; for(int i=1;i<n;i++) { father[i]=i; scanf("%s %d",q,&a); char p[10]; int aa; for(int i=1;i<=a;i++) { scanf("%s %d",p,&aa); add_edge(q[0]-64,p[0]-64,aa); } } kruskal(); } return 0; }
标签:break find scan 限制 logs 内存 超出 nbsp 分享
原文地址:http://www.cnblogs.com/sssy/p/7214733.html