哎····,第一次打的代码,哥用G++提交,你猜,咋了?居然超时了!
好吧!我错了!我上网百度了一些代码!看别人如何优化的,好吧,和我的差不多嘛!
于是乎我将别人的代码提交试试,居然也超时了!我又改用C++提交,居然AC了!
好吧!你是在玩我呢啊!
哎····,擦擦擦擦····························
又是一道并查集题!
#include"algorithm"
using namespace std;int pre[600];
int find(int k)
{
if(k==pre[k])
return k;
return pre[k]=find(pre[k]);
}
struct node
{
int x,y;
int z;
}a[26000];
struct xx
{
int x1,y1;
int z1;
}aa[26000];
int cmp(xx a,xx b)
{
return a.z1<b.z1;
}
int main()
{
int T,n,m,k,t,i,aaa[200],f[200],f1,f2,ans,flag,j,w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)
pre[i]=i;
for(i=0;i<m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
for(i=0;i<k;i++)
{
scanf("%d",&t);
for(j=0;j<t;j++)
{
scanf("%d",&aaa[j]);
f[j]=find(aaa[j]);
}
for(j=1;j<t;j++)
pre[f[j]]=f[0];
}
w=0;
for(i=0;i<m;i++)
{
f1=find(a[i].x);
f2=find(a[i].y);
if(f1!=f2)
{
aa[w].x1=a[i].x;
aa[w].y1=a[i].y;
aa[w].z1=a[i].z;
w++;
}
}
sort(aa,aa+w,cmp);
ans=0;
for(i=0;i<w;i++)
{
f1=find(aa[i].x1);
f2=find(aa[i].y1);
if(f1!=f2)
{
ans+=aa[i].z1;
pre[f1]=f2;
}
}
flag=0;
for(i=1;i<=n;i++)
if(i==pre[i])
flag++;
if(flag==1)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3371