课程设计 问题 R: 自来水管道

题目描述

你领到了一个铺设校园内自来水管道的任务。校园内有若干需要供水的点,每两个供水点可能存在多种铺设路径。对于每一种铺设路径,其成本是预知的。

任务要求最终铺设的管道保证任意两点可以直接或间接的联通,同时总成本最低。

输入

每个测试用例由多行组成,第一行是两个整数P和R,P代表供水点数(1<=P<=50),每个点都对应1到P中的一个唯一编号。R代表可能的铺设路径数,路径数可能有非常多。接下有R行,每行格式如下:

节点A编号 节点B编号 路径成本

路径成本不超过100。

测试用例之间有一空行分开。输入结束用P=0表示,注意没有R值。

输出

每个测试用例占用一行输出最低总成本。

样例输入

1 0

2 3
1 2 37
2 1 17
1 2 68

3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32

5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12

0

样例输出

0
17
16
26

题意:P个点,给出两个点间的间的距离,求最小生成树所需的成本。思路:克鲁斯卡尔算法。将给出的边按权值进行排序,遍历所有的边,如果该边的两个顶点不连通,则加入到生成树中。用sort函数排序权值。关键在于判断该两点是否连通。我用了并查集的思想。若两点联通则将一点的终节点指向另一点的终节点(用了数组b来存,b[i]就表示节点i指向的下一个节点)。先初始化,让b[i]=i。用自定义函数f(i)求i节点的终节点。如果两节点a,b的f(a)和f(b)不想等。说明a,b,两节点不连通。



#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct
{
    int v[3];
} p;                   //用来存两个供水点和之间的距离
bool comp(p a, p b)    //按v[2]中的元素进行比较
{
    return a.v[2] < b.v[2];
}
p a[10000005];
int b[105];
int f(int i)          //寻找终节点
{
    if(b[i]==i) return i;    else return f(b[i]);    //应该可以优化成 return  b[i]=f(b[i]);
}
int main()
{
    int i,t,n,s,j;
    while(scanf("%d",&n)==1&&n)
    {
        s=0;
        scanf("%d",&t);
        for(i=1; i<=t; i++)
            scanf("%d%d%d",&a[i].v[0],&a[i].v[1],&a[i].v[2]);
        sort(a,a+t,comp);
        for(i=1; i<=n; i++)
            b[i]=i;
        for(i=1; i<=t; i++)
        {
            if(f(a[i].v[0])!=f(a[i].v[1]))   //如果不连通就加入生成树中并累加路径
            {

                s+=a[i].v[2];
                b[f(a[i].v[0])]=f(a[i].v[1]);   //将一点的终节点指向另一点的终节点
            }
        }
        printf("%d\n",s);
    }
    return 0;
}
时间: 2025-01-05 21:46:45

课程设计 问题 R: 自来水管道的相关文章

南京邮电大学课程设计——加速度检测应用

2周的课程设计花了3天(其实真相是花了2个小时就写好了,只是老师一会让我改这一会让我改那而已)..这个时间可能有点长了,况且读者们看以下的的题目或许就要开始嘲笑我了,"这么简单的一个东西居然还要用那么久"...哈哈,不喜勿吐槽.... 题目3.压力监测应用 (1) 检测压力是否超过阈值 (2) 若超过压力阈值,则通过一条短信通知联系人,短信内容需包含当前压力. (3) 可设置联系人名称和联系手机号码 (4) 可设置压力阈值 (5) 记录告警信息到数据库,方便查询 以下开始直接贴代码:

Android课程设计第六天欢迎界面(跳转)

注意:课程设计只为完成任务,不做细节描述~ package com.example.myapplication; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.TextView; /** * Created by 樱花落舞

Android课程设计第二天界面排版

注意:课程设计只为完成任务,不做细节描述~ 老师叫我们做一个这个样子,然后.. 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"

课程设计(物体类),图片可能没有加载出来,自己运行一下就行了

一.课程设计题目与要求(包括题目与系统功能要求) A.<1>设计如下类,其功能和部分成员如下: Object:抽象类,所有的物体都有价值(profit)属性: Point:点的位置: Line(线段),Rectangle,Cuboid, Square,Cube,Circle,Cylinder. <2>功能:能够实现上述物体的移动(move),放大(zoomin),缩小(zoomout),大小比较(compare),打印物品信息(cout<<编号.面积.容积和价值)等操作

java(课程设计之记事本界面部分代码公布)

代码:涉及记事本的一些界面......!! 1 /* 2 *java课程设计之记事本(coder @Gxjun) 3 * 编写一个记事本程序 4 * 要求: 5 * 用图形用户界面实现. 6 * 能实现编辑.保存.另存为.查找替换等功能. 7 * 提示:使用文件输入输出流. 8 */ 9 package project; 10 11 import javax.swing.*; 12 import java.awt.*; 13 import java.awt.event.*; //引用类设置触发事

Android课程设计第五天欢迎界面(滑动)

注意:课程设计只为完成任务,不做细节描述~ 滑动界面 1 package com.example.myapplication; 2 3 import android.content.Intent; 4 import android.os.Handler; 5 import android.os.Message; 6 import android.support.v7.app.AppCompatActivity; 7 import android.os.Bundle; 8 9 import Uti

课程设计之C/C++实现用户登录注册

最近的一个课程设计要求的一个用户登录的程序,通常软件网页等的用户登录注册都是涉及到数据库.但像课程设计这种小程序要求的安全度不高就可以用c/c++实现. 首先,我们要清楚用户登录的流程.应该大家对这些并不陌生. 首先说说注册流程 1.要求输入用户名(如果该用户名已被注册则重新输入) 2.要求输入密码. 3.要求再次输入密码(如果两次密码输入相同则注册成功,否则重新注册).] 其次是登陆流程 1.输入用户名(如果该用户名不存在则重新输入) 2.输入密码(如果正确则进入程序,否则重新登录) 那么下面

数据结构课程设计题目十二_计算机学院学生会的打印机(优先队列)

本文出自:http://blog.csdn.net/svitter 题目12:计算机学院学生会的打印机(优先队列) 小明抱怨学生会的打印机不符合FIFO的原则,看到很多在他后面来打印的同学比他先打印出来.五分钟前,小明的文件就是下一个候选的,如今小明的文件又排到了后面.学生会的同学给小明解释说,学生会的打印机不是採用传统的队列方式,而是採用一种自定义的优先队列方式:每一个要打印的文件被赋予了一个从1到9的优先级(9最高,1最低).打印规定例如以下: 将队列中要打印的文件f从队列中拿出来: 假设在

数据结构课程设计之一元多项式的计算

数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!! 对代码有进行了一下改进,增加了排序的模块:可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点. <pre name="code" class="cpp">#include <stdio.h> #includ