题目编号:1006
题目大意:一个人维护道路,但是因为费用的缘故,所以只能维护部分的。求用最小的费用来维护道路,使这些道路把所有的城市连通。
解题思路:很是典型的求最小生成树,与并查集的算法结合来求解。还是前面那一套,结构体,排序,合并,求值。还用 的Kruskal算法。
感想:比较经典的题目,代码有参考成分。
- #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;
- }