CCF真题之最优灌溉
#include<bits/stdc++.h> //该头文件包含C++所有头文件(编程中显得非常方便,很省时间)
//#include <vector> //若无以上头文件,则需要添加下面这两个头文件才不会报错
//#include <iostream>
using namespace std;
const int maxn=1007;
const int inf=10001;
int n,m; struct node {
int to,cost;
};
bool vis[maxn];
//表示从当前节点到 d[i]节点的距离 ,首先初始化均为无穷大,之后,每找到一个点,则修改其邻接点的最小距离,其他点仍为无穷大
int d[maxn];
vector<node> G[maxn];
void init() {
for(int i=0;i<maxn;i++) {
G[i].clear();
}
}
//最小生成数prim,CCF中可以直接调用
int prim() {
int ans=0;
/* memset(vis,0,sizeof(vis));
memset(dis,100001,sizeof(d));*/ 使用memset初始化结果会溢出,具体原因不清楚
for(int i=1;i<maxn;i++) {
d[i]=inf;
vis[i]=0;
}
d[1]=0;
while(1){ //注释部分用于调试理解代码
//for(i=1;i<=n;i++)
//cout<<d[i]<<" ";
//cout<<endl;
int v=-1;
for(int i=1;i<=n;i++) {
//if(!vis[i]&&v==-1)用来保证只要还有未通过的点,则就可以从当前最后通过的点,找到下一个未通过的点
//if(!vis[i]&&d[i]<d[v])表示与当前通过的点可能连接多个相邻的未通过的点, 故需要找出距离最小的相邻的未通过的点
//这里只可能是当前最后通过的点的所有相邻点,因为只要找到一个点,则对其进行标记通过,再修改其相邻点的距离 ,未相邻点仍为无穷大
if(!vis[i]&&(v==-1||d[i]<d[v])) v=i;
//cout<<"...."<<v<<endl;
}
if(v==-1) break;
vis[v]=1;
ans+=d[v];
for(int i=0;i<G[v].size();i++) {
if(vis[G[v][i].to]) continue;
d[G[v][i].to]=min(d[G[v][i].to],G[v][i].cost);
}
}
return ans;
}
int main() {
int a,b,c; node n1;
while(cin>>n>>m){
init();
for(int i=0;i<m;i++) {
cin>>a>>b>>c;
n1.to=b;n1.cost=c;
G[a].push_back(n1);
n1.to=a;
G[b].push_back(n1);
}
int ans=prim();
cout<<ans<<endl;
//用于检测每个节点的邻接节点以及权值是否正确
/*for(int i=1;i<=n;i++) {
for(int j=0;j<G[i].size();j++)
cout<<G[i][j].to<<" "<<G[i][j].cost<<endl;
}*/ }
}
若CCF中再次考到最小生成树,但是输入方式为:
第一行为:给定n个点,表示当前有多少块麦田
接下来n行表示:
每块麦田之间是否相连接以及相应的权值
如该题输入方式可改为:
4
0 1 0 0
1 0 4 2
0 4 0 3
0 2 3 0
node n1;
while(cin>>n){
init();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>a;
if(a!=0)
{
n1.to=j+1;n1.cost=a;
G[i+1].push_back(n1);
n1.to=i+1;
G[j+1].push_back(n1);
}
}
int ans=prim();
cout<<ans<<endl;
//用于检测每个节点的邻接节点以及权值是否正确
/*for(int i=1;i<=n;i++) {
for(int j=0;j<G[i].size();j++)
cout<<G[i][j].to<<" "<<G[i][j].cost<<endl;
}*/ }
}
CCF真题之最优灌溉的更多相关文章
- CCF真题Z型输出
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> ...
- CCF真题之命令行选项
201403-3 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母 ...
- CCF真题之最大矩形
201312-3 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6 ...
- CCF真题之节日
201503-3 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ y ...
- CCF真题之字符串匹配
201409-3 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一 ...
- CCF真题之网络延时
201503-4 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为1.其他的交换机都连接 ...
- CCF真题之Z字形扫描
201412-2 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 ...
- CCF真题之门禁系统
201412-1 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请问每一条记录中的读者是第几次出现. 输入 ...
- CCF真题之画图
201409-2 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩形的 ...
随机推荐
- ubuntu下c/c++开发环境配置
刚转好的UBUNTU14.04.01 TLS . 试了一下GCC,结果如下不能编译 gcc -o hello hello.cpp gcc: error trying to exec 'cc1plus' ...
- HDFS中高可用性HA的讲解
HDFS Using QJM HA使用的是分布式的日志管理方式 一:概述 1.背景 如果namenode出现问题,整个HDFS集群将不能使用. 是不是可以有两个namenode呢 一个为对外服务-&g ...
- style="display"之后不能获取offsetHeight或clientWidth这类测量的值
如果在html元素中设置了style="display:none;height:90px;"的属性后,是无法获得offsetLeft ,offsetWidth,offsetTop, ...
- C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...
- [LeetCode] Jump Game II(贪婪算法)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 完美解决 .txt文件在Mac上不能打开的问题
- Mockups
Balsamiq Mockups 是一款免费的手绘风格的产品原型设计软件,它一经推出就广受好评,它比纸质的产品原型设计图更加方便存储,而且是简约清爽的手绘风格,UI控件支持自动拖拽,并且可以实现自动对 ...
- 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...
- Inside Flask - flask.__init__.py 和核心组件
Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...
- Mac OS—苹果搭建Android开发环境
如何在MAC OS X 安装Android SDK 我以往用的开发环境都是以MAC OS安装VMware来跑不同的Windows OS,目前慢慢的将所要开发的项目由以往的传统的Wintel转移到Mob ...