题目分析:给n个顶点,和n-1条边,生成一个树,给定k个点,,要求去掉几条边之后,要求这k个顶点不在一个集合内,并且所删除的边得权值之和最小,分析后很明显删除k-1条边,
思路:先对边进行降序排序,然后插入边,如果该边的两个顶点都是属于这k个顶点,那么这条边要删去
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int set[100100];
int vis[100100];
struct node
{
int s,e,v;
}arr[100100];
int cmp(node x,node y)
{
return x.v>y.v;
}
int find(int x)
{
int i;
for(i=x;i!=set[i];i=set[i]);
while(i!=x)
{
int temp=set[x];
set[x]=i;
x=temp;
}
return i;
}
int main()
{
int T,n,k;
scanf("%d",&T);
while(T--)
{
int ans=0;
memset(vis,0,sizeof(vis));
scanf("%d %d",&n,&k);
for(int i=0;i<n-1;i++)
scanf("%d %d %d",&arr[i].s,&arr[i].e,&arr[i].v);
for(int i=0;i<n;i++)
set[i]=i;
for(int i=0;i<k;i++)
{
int temp;
scanf("%d",&temp);
vis[temp]=1;
}
sort(arr,arr+n,cmp);
for(int i=0;i<n-1;i++)
{
int fx=find(arr[i].s);
int fy=find(arr[i].e);
if(vis[fx]==1&&vis[fy]==1)//if(vis[fx]==1&&vis[fx]==1)
{
ans+=arr[i].v;
}
else if(vis[fx]==1)
{
set[fy]=fx;
}
else if(vis[fy]==1)
{
set[fx]=fy;
}
else if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
printf("%d\n",ans);
}
system("pause");
return 0;
}
/*
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int set[100100];
struct node
{
int s,e,v;
}arr[100100];
int cmp(node x,node y)
{
return x.v>y.v;
}
int find(int x)
{
int i;
for(i=x;set[i]!=-1&&i!=set[i];i=set[i]);
while(i!=x)
{
if(set[x]==-1)
break;
int temp=set[x];
set[x]=i;
x=temp;
}
return i;
}
int main()
{
int T,n,k;
scanf("%d",&T);
while(T--)
{
int ans=0;
scanf("%d %d",&n,&k);
for(int i=0;i<n-1;i++)
scanf("%d %d %d",&arr[i].s,&arr[i].e,&arr[i].v);
for(int i=0;i<n;i++)
set[i]=i;
for(int i=0;i<k;i++)
{
int temp;
scanf("%d",&temp);
set[temp]=-1;
}
for(int i=0;i<n;i++)
printf("set[%d]=%d*\n",i,set[i]);
sort(arr,arr+n,cmp);
for(int i=0;i<n-1;i++)
{
printf("g*");
int fx=find(arr[i].s);
if(arr[i].s==2)
printf("set[2]=%d***\n\n",fx);
printf("g*");
int fy=find(arr[i].e);
if(arr[i].e==1)
printf("set[1]=%d***\n\n",fy);
printf("g*");
if(fx==-1&&fy==-1)
{
ans+=arr[i].v;
}
else if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
for(int i=0;i<n;i++)
printf("set[%d]=%d\n",i,set[i]);
printf("%d\n",ans);
}
system("pause");
return 0;
}
*/