poj 2075

#include<iostream>
#include<fstream>

using namespace std;

struct e{
    int s,t;
    double w;
};

e edge[250001];
int n,m;

char c[501][30];

int cmp(const void *a,const void *b){
    if ((*(e*)a).w>(*(e*)b).w)
        return 1;
    return -1;
}
int top;

void add(int s,int t,double w){
    edge[++top].s=s;
    edge[top].t=t;
    edge[top].w=w;
}

int f[501],rank[501];

void init(){
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        f[i]=i;
        rank[i]=0;
    }
}

int father(int s){
    if(s!=f[s])
        f[s]=father(f[s]);
    return f[s];
}

void unionset(int s,int t){
    int i=father(s);
    int j=father(t);
    if(rank[i]<rank[j])
        f[i]=j;
    else
    {
        f[j]=i;
        if(rank[i]==rank[j])
            rank[i]++;
    }
}



void read(){
//    ifstream cin("in.txt");
    int i,j,k;
    char c1[31],c2[31];
    double value;
    double sum;
    cin>>sum;
    cin>>n;
    init();
    for(i=1;i<=n;i++)
        cin>>c[i];
    cin>>m;
    for(i=1;i<=m;i++)
    {
        cin>>c1>>c2>>value;
        for(j=1;j<=n;j++)
            if(strcmp(c1,c[j])==0)
                break;
        for(k=1;k<=n;k++)
            if(strcmp(c2,c[k])==0)
                break;
        add(j,k,value);
    }
    double ans=0;
    j=0;
    qsort(edge+1,m,sizeof(e),cmp);
    for(i=1;i<=m;i++)
    {
        if(father(edge[i].s)!=father(edge[i].t))
        {
            unionset(edge[i].s,edge[i].t);
            ans+=edge[i].w;
            j++;
            if(j==n-1)
            {
                printf("Need %.1lf miles of cable\n",ans);
                return;
            }

            if(ans>sum)
            {
                cout<<"Not enough cable"<<endl;
                return;
            }
        }
    }
}

int main(){
    read();
    return 0;
}

posted on 2011-06-01 17:01  宇宙吾心  阅读(253)  评论(0)    收藏  举报

导航