HDU 1301Jungle Roads Kruskal求解

来源:互联网 发布:硕士论文淘宝代写 编辑:程序博客网 时间:2024/04/30 16:56

题目链接: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;}


0 0
原创粉丝点击