7-10 公路村村通

Posted A-Little-Nut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-10 公路村村通相关的知识,希望对你有一定的参考价值。

7-10 公路村村通(30 分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数N(1000)和候选道路数目M(3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出?1,表示需要建设更多公路。

输入样例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例:

12
技术分享图片
 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 #define maxNv 1001 
 5 #define maxcost 100000
 6 vector<int> cost(maxNv,maxcost);
 7 vector<int> parent(maxNv);//用来储存最小生成树 
 8 int flag=1;
 9 struct enode{
10 int v1,v2;
11 int weight;
12 };
13 using edge=enode*;
14 struct graph{
15 int Nv=0,Ne=0;
16 int G[maxNv][maxNv];
17 };
18 using Graph=graph*;
19 Graph CreateGraph(){
20 Graph gra=new graph();
21 cin>>gra->Nv>>gra->Ne;
22 for(int i=0;i<maxNv;i++)
23 for(int j=0;j<maxNv;j++)
24 gra->G[i][j]=maxcost;
25 return gra;
26 }
27 void Insert(Graph gra,edge e){
28 gra->G[e->v1][e->v2]=e->weight;
29 gra->G[e->v2][e->v1]=e->weight;
30 }
31 Graph BuildGraph(){
32 Graph gra=CreateGraph();
33 edge e=new enode();
34 for(int i=0;i<gra->Ne;i++){
35 cin>>e->v1>>e->v2>>e->weight;
36 Insert(gra,e); 
37 }
38 return gra;
39 }
40 int findmin(Graph gra){
41 int min=maxcost;
42 int v=0;
43 for(int i=1;i<=gra->Nv;i++)
44 if(cost[i]!=0&&cost[i]<min) {min=cost[i];v=i;}
45 return v;
46 }
47 void solve(Graph gra){
48 int v1=1,v2=0;
49 int mincost=0;
50 cost[1]=0; 
51 parent[1]=-1;
52 for(v2=1;v2<=gra->Nv;v2++)
53 if(cost[v2]!=0&&gra->G[v1][v2]!=maxcost&&gra->G[v1][v2]<cost[v2]){
54 cost[v2]=gra->G[v1][v2];
55 parent[v2]=v1;
56 }
57 while(1){
58 v1=findmin(gra);
59 if(v1==0) break;
60 mincost+=cost[v1];
61     cost[v1]=0;
62 for(v2=1;v2<=gra->Nv;v2++)
63 if(cost[v2]!=0&&gra->G[v1][v2]!=maxcost&&gra->G[v1][v2]<cost[v2]){
64 cost[v2]=gra->G[v1][v2];
65 parent[v2]=v1;
66 }
67 }
68 for(int i=1;i<=gra->Nv;i++)
69 if(cost[i]!=0) flag=0;//用来判断是否所有的点都被收进树中了 
70 if(flag==0) cout<<-1;
71 else
72 cout<<mincost;
73 }
74 int main()
75 {
76   Graph gra=BuildGraph();
77   solve(gra);
78 /*  for(int i=1;i<=gra->Nv;i++){
79   for(int j=1;j<=gra->Nv;j++)
80   cout<<gra->G[i][j]<<" ";
81   cout<<endl;
82   }
83 */
84   return 0; 
85 }
View Code

 

 
 

 

以上是关于7-10 公路村村通的主要内容,如果未能解决你的问题,请参考以下文章

村村通公路建设标准

关于农村村村通公路的政策,需要农民集资吗?

公路村村通

08-图7 公路村村通

SDUT 3362 数据结构实验之图论六:村村通公路

5-10 公路村村通 (30分)