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