图的应用之交通路线图的修建

设计城市之间的交通路线图,有6个城市(上海、北京、南京、扬州、南通、苏州),已知城市间拟建设公路。两城市间的建设经济费用自己输入。要建设一个连接6个城市的交通网,使得任意两个城市之间都可以直接或间接到达,使得总的费用最少。

  1. 输入城市间的路线和建设费用;
  2. 输出公路网建设的最经济方案;
  3. 可以选择使用两种算法中的一种(Prim和Kruskal)。
    #include
    #include
    using namespace std;

const int MAXV = 110;
const int MAXE = 10010;
//边集定义部分
struct edge
{
int u, v; //边的两个端点编号
int cost; //边权
}E[MAXE]; //最多有MAXE条边

bool cmp(edge a, edge b)
{
return a.cost < b.cost;
}
//并查集部分
int father[MAXV]; //并查集数组
int findFather(int x) //并查集查询函数
{
int a = x;
while(x != father[x])
{
x = father[x];
}
//路径压缩
while(a != father[a])
{
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
//kruskal部分,返回最小生成树的边权之和,参数n为顶点个数,m为图的边数
int kruskal(int n, int m)
{
//ans为所求边权之和,Num_Edge为当前生成树的边数
int ans = 0, Num_Edge = 0;
for(int i = 0; i < n; i++) //顶点范围是[0,n-1]
{
father[i] = i; //并查集初始化
}
sort(E, E + m, cmp); //所有边按边权从小到大排序
for(int i = 0; i < m; i++) //枚举所有边
{
int faU = findFather(E[i].u); //查询测试边两个端点所在集合的根结点
int faV = findFather(E[i].v);
if(faU != faV) //如果不在一个集合中
{
father[faU] = faV; //合并集合(即把测试边加入最小生成树中)
ans += E[i].cost; //边权之和增加测试边的边权
Num_Edge++; //当前生成树的边数加1
if(Num_Edge == n - 1)
break; //边数等于顶点数减1时结束算法
}
}
if(Num_Edge != n - 1)
return -1; //无法连通时返回-1
else
return ans; //返回最小生成树的边权之和
}

int main()
{
int n, m;
scanf("%d%D", &n, &m); //顶点数、边数
for(int i = 0; i < m; i++)
{
scanf("%d%D%D", &E[i].u, &E[i].v, &E[i].cost); //两个端点编号、边权
}
int ans = kruskal(n, m); //kruskal算法入口
printf("%d\n", ans);
return 0;
}
想问一下这个城市怎么添加,输出的权值怎么改成经济费用