smalltian
没有不努力的大神,只有不努力的菜鸟

最小生成树的题目,深刻理解最小生成树算法以后这道题目不算很难。用的是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 }

 

 

posted on 2012-11-25 10:36  smalltian  阅读(654)  评论(0)    收藏  举报