poj 3228

#include<iostream>
#include<fstream>

using namespace std;

int n,m,ans;


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

e edge[40001];
int f[401];


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

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

int a[401];


void unionset(int s,int t){
    int i,j,k;
    i=father(s);
    j=father(t);
    f[i]=j;
    ans-=(a[i]<0)+(a[j]<0);
    a[j]+=a[i];
    ans+=(a[j]<0);

   
}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t,w;
    while(cin>>n)
    {
        if(n==0) return ;
        for(i=1;i<=n;i++)
            f[i]=i;
        ans=0;
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=n;i++)
        {
            cin>>j;
            a[i]=j-a[i];
            if(a[i]<0) ans++;
        }
        cin>>m;
        for(i=1;i<=m;i++)
        {
            cin>>s>>t>>w;
            edge[i].s=s;
            edge[i].t=t;
            edge[i].w=w;
        }
        if(m!=0)
        qsort(edge+1,m,sizeof(e),cmp);
        int maxx=0;
   
        for(i=1;i<=m;i++)
        {
            if(father(edge[i].s)==father(edge[i].t))
                continue;
            if(ans==0) break;
            unionset(edge[i].s,edge[i].t);
            maxx=edge[i].w;
        }
        if(ans==0)
        cout<<maxx<<endl;
        else
            cout<<"No Solution\n";
    }
}

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

posted on 2011-05-29 19:05  宇宙吾心  阅读(390)  评论(0)    收藏  举报

导航