您的位置:首页 > 其它

SDAU练习四1006

2016-07-07 22:48 204 查看
题目编号:1006

题目大意:一个人维护道路,但是因为费用的缘故,所以只能维护部分的。求用最小的费用来维护道路,使这些道路把所有的城市连通。

解题思路:很是典型的求最小生成树,与并查集的算法结合来求解。还是前面那一套,结构体,排序,合并,求值。还用 的Kruskal算法。

感想:比较经典的题目,代码有参考成分。

[html] view
plain copy

 





#include<iostream>  

#include<algorithm>  

using namespace std;  

char p[1000];  

int n,k;  

struct road  

{  

char s,e;  

int w;  

}r[1000];  

bool cmp(road a,road b)  

{ return a.w<b.w; }  

char find(char x)  

{ return p[x]==x?x:p[x]=find(p[x]); }  

int YJY()  

{  

int sum=0;  

for(int i=0;i<k;i++)  

{  

char x=find(r[i].s),y=find(r[i].e);  

if(x!=y)  

{  

p[x]=y;  

sum+=r[i].w;  

}  

}  

return sum;  

}  

int main()  

{  

while(cin>>n&&n)  

{  

char rs,re;  

int m,rw;  

k=0;  

n--;  

while(n--)  

{  

cin>>rs>>m;  

while(m--)  

{  

cin>>re>>rw;  

r[k].s=rs;  

r[k].e=re;  

r[k].w=rw;  

k++;  

}  

}  

for(char i='A';i<='Z';i++)  

p[i]=i;  

sort(r,r+k,cmp);  

cout<<YJY()<<endl;  

}  

return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: