标签:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int MAXN=100010; 6 struct Node{ 7 int s,e,t; 8 }; 9 Node dt[MAXN]; 10 /*int cmp(const void *a,const void *b){ 11 return (*(Node *)a).t-(*(Node *)b).t) ;// 12 }*/ 13 int cmp(Node a,Node b){ 14 return a.t>b.t; 15 } 16 int pre[MAXN]; 17 int find(int x){ 18 return pre[x]= x==pre[x]?x:find(pre[x]); 19 } 20 int visit[MAXN],n,m,flot; 21 __int64 time; 22 void initial(){ 23 memset(visit,0,sizeof(visit)); 24 memset(pre,-1,sizeof(pre)); 25 time=0;flot=0; 26 } 27 void merge(Node a){ 28 int f1,f2; 29 if(pre[a.s]==-1)pre[a.s]=a.s; 30 if(pre[a.e]==-1)pre[a.e]=a.e; 31 f1=find(a.s);f2=find(a.e); 32 if(f1==f2)return; 33 if(visit[f1]&&visit[f2]){ 34 time+=a.t; 35 flot++; 36 // printf("%d %d\n",a.s,a.e); 37 } 38 else if(f1!=f2){ 39 if(visit[f1])pre[f2]=f1; 40 else pre[f1]=f2; 41 } 42 } 43 int main(){ 44 int T,temp; 45 scanf("%d",&T); 46 while(T--){ 47 initial(); 48 scanf("%d%d",&n,&m); 49 for(int i=0;i<n-1;i++){ 50 scanf("%d%d%d",&dt[i].s,&dt[i].e,&dt[i].t); 51 } 52 ///qsort(dt,n-1,sizeof(dt[0]),cmp); 53 sort(dt,dt+n-1,cmp); 54 for(int i=0;i<m;i++){ 55 scanf("%d",&temp); 56 visit[temp]=1; 57 } 58 for(int i=0;i<n-1;i++){ 59 merge(dt[i]); 60 if(flot==m-1)break; 61 } 62 printf("%I64d\n",time); 63 } 64 return 0; 65 }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4727917.html