这的确也是个大坑;
其实在这是到很简单的最小生成树的题目,但是数据量却很大;
用G++提交会超时,用C++不会超时,而且速度超快;
又长见识了。可惜长得不是做题的能力,而是知道它到底有多坑。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=600; 5 const int oo=11111111; 6 int map[N][N]; 7 int vis[N]; 8 int n,m,k; 9 int low[N]; 10 int prim(int s) 11 { 12 memset(vis,0,sizeof(vis)); 13 for(int i=1;i<=n;i++) 14 low[i]=map[s][i]; 15 low[s]=0; 16 vis[s]=1; 17 int sum=0,v; 18 for(int i=1;i<n;i++) 19 { 20 int Min=oo; 21 for(int j=1;j<=n;j++) 22 if(!vis[j]&&low[j]<Min) 23 { 24 Min=low[j];v=j; 25 } 26 if(Min==oo)return -1; 27 sum+=Min; 28 vis[v]=1; 29 for(int j=1;j<=n;j++) 30 { 31 if(!vis[j]&&low[j]>map[j][v]) 32 low[j]=map[j][v]; 33 } 34 } 35 return sum; 36 } 37 int main() 38 { 39 int t; 40 scanf("%d",&t); 41 while(t--) 42 { 43 scanf("%d %d %d",&n,&m,&k); 44 for(int i=1;i<=n;i++) 45 for(int j=1;j<=n;j++) 46 { 47 map[i][j]=oo; 48 } 49 int a,b,c; 50 for(int i=1;i<=m;i++) 51 { 52 scanf("%d %d %d",&a,&b,&c); 53 if(map[a][b]>c)map[a][b]=map[b][a]=c; 54 } 55 int ct,room[N]; 56 for(int i=1;i<=k;i++) 57 { 58 scanf("%d",&ct); 59 for(int j=1;j<=ct;j++) 60 { 61 scanf("%d",&room[j]); 62 } 63 for(int j=1;j<=ct;j++) 64 for(int s=j+1;s<=ct;s++) 65 { 66 map[room[s]][room[j]]=map[room[j]][room[s]]=0; 67 } 68 } 69 int result=prim(1); 70 printf("%d ",result); 71 } 72 return 0; 73 }