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
作者: 陈越
单位: 浙江大学
时间限制: 400ms
内存限制: 64MB
代码长度限制: 16KB
#include<iostream>
#include<vector>using namespace std;
#define maxNv 1001
#define maxcost 100000
vector<int> cost(maxNv,maxcost);
vector<int> parent(maxNv);//用来储存最小生成树
int flag=1;
struct enode{
int v1,v2;
int weight;
};
using edge=enode*;
struct graph{
int Nv=0,Ne=0;
int G[maxNv][maxNv];
};
using Graph=graph*;
Graph CreateGraph(){
Graph gra=new graph();
cin>>gra->Nv>>gra->Ne;
for(int i=0;i<maxNv;i++)
for(int j=0;j<maxNv;j++)
gra->G[i][j]=maxcost;
return gra;
}
void Insert(Graph gra,edge e){
gra->G[e->v1][e->v2]=e->weight;
gra->G[e->v2][e->v1]=e->weight;
}
Graph BuildGraph(){
Graph gra=CreateGraph();
edge e=new enode();
for(int i=0;i<gra->Ne;i++){
cin>>e->v1>>e->v2>>e->weight;
Insert(gra,e);
}
return gra;
}
int findmin(Graph gra){
int min=maxcost;
int v=0;
for(int i=1;i<=gra->Nv;i++)
if(cost[i]!=0&&cost[i]<min) {min=cost[i];v=i;}
return v;
}
void solve(Graph gra){
int v1=1,v2=0;
int mincost=0;
cost[1]=0;
parent[1]=-1;
for(v2=1;v2<=gra->Nv;v2++)
if(cost[v2]!=0&&gra->G[v1][v2]!=maxcost&&gra->G[v1][v2]<cost[v2]){
cost[v2]=gra->G[v1][v2];
parent[v2]=v1;
}
while(1){
v1=findmin(gra);
if(v1==0) break;
mincost+=cost[v1];
cost[v1]=0;
for(v2=1;v2<=gra->Nv;v2++)
if(cost[v2]!=0&&gra->G[v1][v2]!=maxcost&&gra->G[v1][v2]<cost[v2]){
cost[v2]=gra->G[v1][v2];
parent[v2]=v1;
}
}
for(int i=1;i<=gra->Nv;i++)
if(cost[i]!=0) flag=0;//用来判断是否所有的点都被收进树中了
if(flag==0) cout<<-1;
else
cout<<mincost;
}
int main()
{
Graph gra=BuildGraph();
solve(gra);
/* for(int i=1;i<=gra->Nv;i++){
for(int j=1;j<=gra->Nv;j++)
cout<<gra->G[i][j]<<" ";
cout<<endl;
}
*/
return 0;
}