注意带*的行,应该就没问题了,Prim #include<iostream> using namespace std; const int N=300; const int inf=999999999; int arc[N][N]; bool f[N]; int M[N]; int MaxV,m; void Destroy(){ int i,j; for(i=0;i<m;i++){ int t=M[i]; f[t]=true; } } void Prim(){ int ans=0,Nv=1; int dist[N],close[N]; bool mark[N]; int i,j,s=-1; for(i=0;i<MaxV;i++)if(!f[i]){ s=i; break; } if(s==-1){ printf("what a pity!/n"); return ; } for(i=0;i<MaxV;i++)if(!f[i]){ dist[i]=arc[s][i]; close[i]=s; mark[i]=false; } mark[s]=true; int mins,k; for(i=1;i<MaxV;i++){ mins=inf; for(j=0;j<MaxV;j++){ if(!mark[j]&&!f[j]&&mins>dist[j]){ mins=dist[j];k=j; } } if(mins==inf) break; Nv++; ans+=arc[k][close[k]]; mark[k]=true; for(j=0;j<MaxV;j++){ if(!mark[j]&&!f[j]&&arc[k][j]!=inf){ if(dist[j]>arc[k][j]){ dist[j]=arc[k][j]; close[j]=k; } } } } if(Nv==MaxV-m) printf("%d/n",ans); else printf("what a pity!/n"); } int main(){ int ncase,l,e1,c,a,b,n,e2,max=-1; int i,j; cin>>ncase; while(ncase--){ memset(f,false,sizeof f); for(i=0;i<N;i++){ for(j=0;j<N;j++){ if(i==j) arc[i][j]=0; else arc[i][j]=inf; } } scanf("%d%d",&l,&e1); for(i=0;i<e1;i++){ scanf("%d%d%d",&a,&b,&c); if(arc[a][b]>c)//*****************************// arc[a][b]=arc[b][a]=c; } scanf("%d%d",&n,&e2); for(i=0;i<e2;i++){ scanf("%d%d%d",&a,&b,&c); if(arc[a][b]>c)//*****************************// arc[a][b]=arc[b][a]=c; } MaxV=l+n; scanf("%d",&m); for(i=0;i<m;i++){ scanf("%d",&M[i]); } Destroy(); Prim(); } return 0; }