话说这道蛋疼的题,是专题里面的,我现在还是没有过,,,,,,TLE到吐血,,TLE了20多次,,,还是过不了。G++真让人蛋疼,,,在外面用C++,600ms过了。蛋疼,,,,,,,听说用prime900多ms可以过,,囧,,,明天看看prime算法,,再试试。。。。。题目:
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
1
#include <iostream> #include <string.h> #include <algorithm> using namespace std; const int N=25010; int leftt[N],rightt[N],value[N],r[N],father[N]; int cmp(int i,int j){ return value[i]<value[j]; } int find(int x){ if(father[x]!=x) father[x]=find(father[x]); return father[x]; } int main(){ int kk; scanf("%d",&kk); while(kk--){ for(int i=0;i<N;++i){ leftt[i]=0;rightt[i]=0; value[i]=1000005; r[i]=i; father[i]=i; } int n,m,k; scanf("%d%d%d",&n,&m,&k); int a,b,c,i,j,num=0; for(i=0;i<m;++i){ scanf("%d%d%d",&leftt[i],&rightt[i],&value[i]); } int t,x,y; while(k--){ scanf("%d",&t); scanf("%d",&x); t--; while(t--){ scanf("%d",&y); leftt[m]=x; rightt[m]=y; father[m]=x; value[m]=0; m++; } } /*for(i=0;i<m;++i) printf("%d ",father[i]); printf("\n");*/ sort(r,r+m,cmp); int sum=0; for(i=0;i<m;++i){ int pos=r[i]; /*printf("%d\n",pos);*/ int xx=find(leftt[pos]); int yy=find(rightt[pos]); /*printf("xx=%d yy=%d\n",xx,yy);*/ if(xx!=yy){ father[yy]=xx; sum+=value[pos]; /* printf("sum=%d\n",sum);*/ } } int flag=1; int zz=find(father[1]); for(i=2;i<=n;++i){ if(zz!=father[i]&&zz!=find(father[i])) {flag=0;break;} } if(flag) printf("%d\n",sum); else printf("-1\n"); } return 0; }