最短路水题,Kus算法秒过
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=25000+10;
int n,m,k,p[maxm],w;
int sum;
struct node
{
int u,v,c;
} t[maxm],tt[maxm];
int cmp(node p,node q)
{
return p.c<q.c;
}
int find(int k)
{
if(p[k]!=k)
{
return p[k]=find(p[k]);
}
else
{
return p[k];
}
}
void kus()
{
int i;
for(i=0; i<w; i++)
{
int x1=find(tt[i].u);
int y1=find(tt[i].v);
if(x1!=y1)
{
p[y1]=x1;
sum+=tt[i].c;
}
}
}
int main()
{
int y;
scanf("%d",&y);
while(y--)
{
int i,j;
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=n; i++)
{
p[i]=i;
}
int u,v,c;
for(i=0; i<m; i++)
{
scanf("%d%d%d",&u,&v,&c);
t[i].u=u;
t[i].v=v;
t[i].c=c;
}
int temp1,temp2,temp3;
w=0;
int ans=0;
for(i=0;i<k;i++)
{
scanf("%d",&temp1);
scanf("%d",&temp2);
int x1=find(temp2);
for(j=1;j<temp1;j++)
{
scanf("%d",&temp3);
int y1=find(temp3);
if(x1!=y1)
{
p[y1]=x1;
}
}
}
for(i=0;i<m;i++)
{
int f1=find(t[i].u);
int f2=find(t[i].v);
if(f1!=f2)
{
tt[w].u=t[i].u;
tt[w].v=t[i].v;
tt[w].c=t[i].c;
w++;
}
}
sort(tt,tt+w,cmp);
sum=0;
kus();
int ok=0;
for(i=1;i<=n;i++)
{
if(p[i]==i)
{
ok++;
}
}
if(ok==1)
{
printf("%d\n",sum);
}
else
{
printf("-1\n");
}
}
return 0;
}