链接地址http://acm.fzu.edu.cn/problem.php?pid=1096 #include<iostream> using namespace std; #include<map> int a[1002][1002],b[1002]; int main() { int N,M; int i,j; int min=0; int lowcost[1003]; int sum; lowcost[1002]=32767; cin>>N; while(N--) { sum=0; cin>>M; for(i=0;i<M;i++) { cin>>b[i]; } for( i=0;i<M;i++) for(j=0;j<M;j++) cin>>a[i][j]; for(i=1;i<M;i++) { lowcost[i]=a[0][i]+b[0]+b[i]; } lowcost[0]=0; for(i=1;i<M;i++) { min=1002; for(j=1;j<M;j++) { if(lowcost[j]<lowcost[min]&&lowcost[j]!=0) min=j; } sum+=lowcost[min]; lowcost[min]=0; for(int j=1;j<M;j++) if(j!=min) if(lowcost[j]>a[min][j]+b[min]+b[j]) { lowcost[j]=a[min][j]+b[min]+b[j]; } } cout<<sum<<endl; } return 0; } 注意要点:对于以遍历过的点lowcost要赋值0;