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;
}
#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;
}
浙公网安备 33010602011771号