最小生成树的题目,深刻理解最小生成树算法以后这道题目不算很难。用的是prim算法。把已经建好路的村庄dis置为0,这样的话最小生成树的边一定会有这几条已建好的路,从没有建好的路的村庄开始生成。(在很多情况下要置辅助数组lowcost为MAX,但是这道题目不用)
1 #include<iostream> 2 using namespace std; 3 int dis[100][100]; 4 int v1,v2; 5 int lowcost[100]; 6 int needroad; 7 int N; 8 void prim() 9 { 10 int i,j; 11 for(i=0;i<N;i++) 12 { 13 if(i!=(v1-1)) 14 { 15 lowcost[i]=dis[v1-1][i]; 16 } 17 } 18 lowcost[v1-1]=-1; 19 int postion=v1-1; 20 for(i=1;i<N;i++) 21 { 22 int Min=10000; 23 for(j=0;j<N;j++) 24 { 25 if(Min>lowcost[j] && lowcost[j]>=0) 26 { 27 Min=lowcost[j]; 28 postion=j; 29 } 30 } 31 needroad+=lowcost[postion]; 32 lowcost[postion]=-1; 33 for(j=0;j<N;j++) 34 { 35 if(dis[postion][j]<lowcost[j]) 36 { 37 lowcost[j]=dis[postion][j]; 38 } 39 } 40 } 41 } 42 int main() 43 { 44 freopen("in.txt","r",stdin); 45 while(cin>>N) 46 { 47 int i,j; 48 for(i=0;i<N;i++) 49 { 50 for(j=0;j<N;j++) 51 { 52 cin>>dis[i][j]; 53 } 54 } 55 int Q; 56 cin>>Q; 57 for(i=0;i<Q;i++) 58 { 59 cin>>v1>>v2; 60 dis[v1-1][v2-1]=0; 61 dis[v2-1][v1-1]=0; 62 } 63 needroad=0; 64 prim(); 65 cout<<needroad<<endl; 66 } 67 return 0; 68 }
浙公网安备 33010602011771号