问题 B: 【例4-9】城市公交网建设问题

问题 B: 【例4-9】城市公交网建设问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 135  解决: 70
[
提交][状态][讨论版][命题人:quanxing][Edit] [TestData]

题目链接:http://acm.ocrosoft.com/problem.php?cid=1711&pid=1

题目描述

有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点,即任一对城市都是连通的。现在的问题是,要修建若干高速公路把所有城市联系起来,问如何设计可使得工程的总造价最少?

输入

n(城市数,1<≤n≤100

e(边数)

以下e行,每行3个数i,j,wiji,j,wij ,表示在城市i,j之间修建高速公路的造价。

输出

n-1行,每行为两个城市的序号,表明这两个城市间建一条高速公路。

注意看测试数据的输出顺序,有排序要求。

样例输入

5 8

1 2 2

2 5 9

5 4 7

4 1 10

1 3 12

4 3 6

5 3 3

2 3 8

样例输出

1 2

2 3

3 4

3 5

思路:最小生成树,用克鲁斯卡尔解决,然后按字典序列输出就行了

代码:

#include<bits/stdc++.h>

using namespace std;

int n, m;

struct Node

{

    int first, end, c;

}edge[100000];

int father[100000];

bool cmp(const Node a, const Node b)//对边排序

{

    return a.c < b.c;

}

void init()//初始化父节点

{

    for (int i = 1; i <= m; i++)

    {

         father[i] = i;

    }

}

int Find(int a)

{

    return father[a] == a ? a : father[a] = Find(father[a]);//寻找父节点

}

struct aa

{

    int xx, yy;

}s[10000];

bool cmp1(const aa a, const aa b)

{

    if (a.xx == b.xx)return a.yy < b.yy;

    return a.xx < b.xx;

}

int main()

{

    int ans = 0;

    cin >> n;

    cin >> m;

    int num = 0;

    int sum = 0;

    for (int i = 1; i <= m; i++)//克鲁斯卡尔算法

    {

         cin >> edge[i].first >> edge[i].end >> edge[i].c;

         sum += edge[i].c;

    }

    init();

    sort(edge + 1, edge + m + 1, cmp);

    for (int i = 1; i <= m; i++)

    {

         int a = Find(edge[i].first);

         int b = Find(edge[i].end);

         if (a != b)//节点覆盖

         {

             father[a] = b;

             s[++num].xx = min(edge[i].first, edge[i].end);

             s[num].yy = max(edge[i].first, edge[i].end);

             //ans+=edge[i].c;

         }



    }

    sort(s + 1, s + num + 1, cmp1);

    for (int i = 1; i <= num; i++)

    {

         cout << s[i].xx << " " << s[i].yy << endl;

    }







}

 

c++城市公交查询系统 1.设有一文件对象in_file,若在while循环中用in_file>> 每次从文件中得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有问题, 其中的原因之一是你原来申请的空间不够大, 后来往这个空间中放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有问题; 而使用指针或者引用传递参数时不仅不会出现问题, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有指针成员,那么形参的指针成员的值和 实参的指针成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统撤消, 这时,形参调用析构函数,释放用new动态申请的内存。在函数的外面, 作为实参的对象的指针成员其实已经被撤消了,所以当程序结束, 系统撤消这个对象时,这个对象又要调用析构函数来释放指针成员, 但这时指针其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其中####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值