hdu 4313 Matrix 并查集
2012-07-26 23:00
274 查看
题目分析:给n个顶点,和n-1条边,生成一个树,给定k个点,,要求去掉几条边之后,要求这k个顶点不在一个集合内,并且所删除的边得权值之和最小,分析后很明显删除k-1条边,
思路:先对边进行降序排序,然后插入边,如果该边的两个顶点都是属于这k个顶点,那么这条边要删去
代码:
思路:先对边进行降序排序,然后插入边,如果该边的两个顶点都是属于这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; } */
相关文章推荐
- HDU 1163 Eddy's digital Roots
- 【最小生成树+Prim】杭电 hdu 1233 还是畅通工程
- HDU 2063过山车 解题报告(我的第一道二分匹配)
- HDU 2717 Catch That Cow
- hdu_1201:18岁生日
- hdu 3729(二分匹配)
- HDU 4628 多校第三场1008 dp
- hdu 1195 Open the Lock
- hdu 3652 B-number (数位DP)
- HDU 1114 1248(DP,完全背包)
- hdu 4716 A Computer Graphics Problem(水题)
- hdu 1878 欧拉回路 欧拉回路+并查集
- HDU_4939_Stupid Tower Dfense_DP
- hdu 2055 An easy problem (水题)
- hdu 1535 || poj 1511 Invitation Cards(heap + dijstra || spfa)
- hdu 3065 AC自动机
- hdu 5201 The Monkey King 生成函数
- hdu 4109 Instrction Arrangement (topo+关键路径) (附简单的测试数据)
- HDU - 2732 Leapin' Lizards(ISAP Dinic EK)
- HDU 5410 CRB and His Birthday