您的位置:首页 > 其它

HDU 1301 Jungle Roads Kruskal求解

2015-04-25 20:29 417 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/M

题意:热带的一个国家还是啥的,需要维护network,求最小维护费用问题,几乎就是最小生成树意思。

思路:Kruskal求解,没啥亮点,可以用map方便的把字符整型化。也可以用字符减去'A'。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>

using namespace std;
struct edge{
int u,v,w;
bool operator< (const edge &a)const{
return w<a.w;
}
}E[900];

map<char,int> mp;//把字符整型化
int N,tot;
int pre[30];

int find(int x){
int t=x;
while(t!=pre[t]) t=pre[t];
while(x!=t) pre[x]=t,x=pre[x];
return t;
}

void Kruskal(){
for(int i=0;i<=26;i++) pre[i]=i;
int sum=0,cnt=1;
for(int i=0;i<tot;i++){
int u=E[i].u,v=E[i].v,w=E[i].w;
int fu=find(u),fv=find(v);
if(fu==fv) continue;
pre[fu]=fv;sum+=w;cnt++;
if(cnt==N) break;
}
cout<<sum<<endl;
}

int main(){
//freopen("D:\\in.txt","r",stdin);
for(int i=0;i<26;i++) mp['A'+i]=i;
while(cin>>N && N){
char ch;
int k,t;
tot=0;
for(int i=0;i<N-1;i++){
cin>>ch>>k;
for(int j=0;j<k;j++){
cin>>ch>>t;
E[tot++]=(edge){i,mp[ch],t};
}
}
sort(E,E+tot);
Kruskal();

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