题目分析:给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; } */