201412-4
问题描述
  雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。   现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水渠)。请问灌溉所有麦田最少需要多少费用来修建水渠。
输入格式
  输入的第一行包含两个正整数n, m,分别表示麦田的片数和雷雷可以建立的水渠的数量。麦田使用1, 2, 3, ……依次标号。   接下来m行,每行包含三个整数ai, bi, ci,表示第ai片麦田与第bi片麦田之间可以建立一条水渠,所需要的费用为ci
输出格式
  输出一行,包含一个整数,表示灌溉所有麦田所需要的最小费用。
样例输入
4 4 1 2 1 2 3 4 2 4 2 3 4 3
样例输出
6
样例说明
  建立以下三条水渠:麦田1与麦田2、麦田2与麦田4、麦田4与麦田3。
评测用例规模与约定
  前20%的评测用例满足:n≤5。   
      前40%的评测用例满足:n≤20。
   前60%的评测用例满足:n≤100。   
        所有评测用例都满足:1≤n≤1000,1≤m≤100,000,1≤ci≤10,000。
 
源代码:

#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

输出结果仍为6
 
 
main函数中代码修改如下:
int main()
{
  int a;
   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真题之最优灌溉的更多相关文章

  1. CCF真题Z型输出

    #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> ...

  2. CCF真题之命令行选项

    201403-3 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母 ...

  3. CCF真题之最大矩形

    201312-3 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6 ...

  4. CCF真题之节日

    201503-3 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ y ...

  5. CCF真题之字符串匹配

    201409-3 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一 ...

  6. CCF真题之网络延时

    201503-4 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为1.其他的交换机都连接 ...

  7. CCF真题之Z字形扫描

    201412-2 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 ...

  8. CCF真题之门禁系统

    201412-1 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请问每一条记录中的读者是第几次出现. 输入 ...

  9. CCF真题之画图

    201409-2 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩形的 ...

随机推荐

  1. final关键字+const关键字

    final关键字 1.如果我们希望某个类不被其它的类来继承(可能因为安全考虑),可以使用final. 例题 <? final class A{} class B extends A{};//会报 ...

  2. HBase HDFS目录树

    一.0.94-cdh4.2.1版本系统级别的一级目录如下,用户自定义的均在这个/hbase 下的一级子目录下/hbase/-ROOT-/hbase/.META./hbase/.archive/hbas ...

  3. HttpContext为null new HttpContextWrapper(System.Web.HttpContext.Current)

    HttpContext = (context == null ? new HttpContextWrapper(System.Web.HttpContext.Current) : context);

  4. Bulk Insert & BCP执行效率对比(续)

    上回由于磁盘空间(约70G)不足,导致Bulk Insert和BCP导入中途失败:今次统一一些操作,以得到Bulk insert与BCP分别执行效率: 1. 15435390笔数据,21.7G csv ...

  5. JS实现一个简单的计算器

    使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...

  6. Internal Server Error500

    开启#LoadModule rewrite_module modules/mod_rewrite.so

  7. The identity used to sign the executable is no longer valid.

    昨天运行还好好的,今天Xcode突然报这个错误. 在网上搜索了一番,也没有找到合适的解决办法. 那怎么办呢? 于是我就登陆了Appstore的开发者账号,发现里面的证书都是invalid状态,我想应该 ...

  8. 替换SearchBar 键盘上的 搜索 按钮

    for (UIView *searchBarSubview in [searchBar subviews]) {        if ([searchBarSubview conformsToProt ...

  9. 在Visual Studio 2015中运行OPENGL

    Starting an OpenGL project in VS 2015 is really easy, thanks to the NupenGL.Core nuget package. Here ...

  10. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...