#include <cstdio> #include <algorithm> using namespace std; struct node { int x,y,val; }w[25002*3]; int father[505]; bool cmp(const node &a,const node &b) { return a.val<b.val; } int find(int x) { while(x!=father[x]) x=father[x]; return x; } int fun(int n,int m) { int ans,a,b; ans=0; for (int i=1;i<=m;i++) { a=find(w[i].x); b=find(w[i].y); if(a!=b) { father[a]=b; ans+=w[i].val; } } return ans; } int main() { int n,m,k,p,q,t,test,cnt; scanf("%d",&test); while(test--) { scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++) father[i]=i; for(int i=1;i<=m;i++) { scanf("%d %d %d",&w[i].x,&w[i].y,&w[i].val); } for(int i=0;i<k;i++) { scanf("%d %d",&t,&p); for (int j=1;j<t;j++) { scanf("%d",&q); father[find(q)]=father[find(p)]; } } sort(w+1,w+m+1,cmp); if(n==1) { printf("0\n"); continue; } t=fun(n,m); cnt=0; for(int i=1;i<=n;i++) if(father[i]==i) cnt++; if(cnt==1) printf("%d\n",t); else printf("-1\n"); } return 0; }
//prim算法
#include <stdio.h> #include <string.h> #define INF 10000000 #define MAX 505 int map[MAX][MAX]; int dist[MAX],visited[MAX]; void prim(int n) { int i,j,min,u,sum=0; for (i=1;i<=n;i++) { dist[i]=map[1][i]; visited[i]=0; } visited[1]=1; dist[1]=INF; for(i=2;i<=n;i++) { min=INF; u=i; for (j=1;j<=n;j++) { if(!visited[j]&&dist[j]<min) { min=dist[j]; u=j; } } sum+=min; visited[u]=1; if(sum>=INF) break; for(j=1;j<=n;j++) { if(!visited[j]&&dist[j]>map[u][j]) dist[j]=map[u][j]; } } if(sum>=INF) printf("-1\n"); else printf("%d\n",sum); } int main() { int i,j,n,m,k,t,test,len; int arr[MAX]; scanf("%d",&test); while(test--) { memset(arr,0,sizeof(arr)); scanf("%d %d %d",&n,&m,&k); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) map[i][j]=map[j][i]=INF; map[i][i]=0; } while(m--) { scanf("%d %d %d",&i,&j,&len); if(len<map[i][j]) map[i][j]=map[j][i]=len; } while(k--) { scanf("%d",&t); for(i=0;i<t;i++) scanf("%d",&arr[i]); for(i=0;i<t;i++) for(j=i+1;j<t;j++) map[arr[i]][arr[j]]=map[arr[j]][arr[i]]=0; } prim(n); } return 0; }