[CODEVS 2627]村村通
【问题描述】
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000。
【数据范围】
对于所有的数据,3≤n≤100,其中n为农场个数。
【算法解析】
最小生成树基础题,以下代码使用基于并查集维护的Kruskal算法解决。
【程序代码】
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int SIZE=10010; 5 struct graph{ 6 int begin,end,value; 7 }g[SIZE]; 8 int fa[110],n,num=0,cal=0,tot=0; 9 bool cmp(graph x,graph y) 10 { 11 return x.value<y.value; 12 } 13 int find(int x) 14 { 15 return fa[x]==x?fa[x]:fa[x]=find(fa[x]); 16 } 17 int main() 18 { 19 scanf("%d",&n); 20 for (int i=1;i<=n;i++) fa[i]=i; 21 for (int i=1;i<=n;i++) 22 for (int j=1;j<=n;j++) 23 { 24 int t; 25 scanf("%d",&t); 26 if (i<j) 27 { 28 g[++num].begin=i; 29 g[num].end=j; 30 g[num].value=t; 31 } 32 } 33 sort(g+1,g+num+1,cmp); 34 for (int i=1;i<=num;i++) 35 { 36 if (find(g[i].begin)!=find(g[i].end)) 37 { 38 fa[find(g[i].end)]=find(g[i].begin); 39 tot+=g[i].value; 40 cal++; 41 } 42 if (cal==n-1) break; 43 } 44 printf("%d",tot); 45 return 0; 46 }
声明:本博文为博主原创博文,未经允许请勿转载。