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. background和background-size

    今天偶遇一个小问题. 添加logo图片时, 由于不需要重新定位图片位置,就准备偷懒在间歇属性中省略background-position的属性,然而很不幸的是,结果却是酱紫的(谷歌浏览器): 不能加载 ...

  2. C#中Dynamic关键字

    dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能. 什么是"动态"? 编程语言有时可以划分为静态类型化语言和动态类型化语言.C#和Java经常被认为是静 ...

  3. Cocos2d-JS引入其他场景小实例

    创建新项目,目标是把LogoNode.js场景引入app.js 新建LogoNode.js var LogoLayer = cc.Layer.extend({ ctor:function () { t ...

  4. android判断pad还是手机

    第一种. Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); if (fr ...

  5. LINQ to SQL系列四 使用inner join,outer join

    先看一个最简单的inner join,在读取Student表时inner join Class表取的对应的Class信息: static void Main(string[] args) { usin ...

  6. [LeetCode]题解(python):036-Valid Sudoku

    题目来源 https://leetcode.com/problems/valid-sudoku/ etermine if a Sudoku is valid, according to: Sudoku ...

  7. C++中string转化为常用数值类型

    //模板类 用于将string类型转化为 常用数值类型 template <class Type> Type stringToNum(const string& str) { is ...

  8. 好网站:字体转换器在线转换 http://www.diyiziti.com/

    偶然间发现这个网站,它可以将文字设置字体并做成图片,也有很多好的字体下载如瘦金体. 下载下来的ttf文件在win7里可以右键点击install,在vista和xp里可以直接拷贝到window\font ...

  9. 关于使用"/"来 dispatcherServlet 的url-pattern带来的问题

    之前一直使用*.do来做的,但是绝的*.do很丑,于是就改用"/"来配置: <servlet> <servlet-name>dispatcherServle ...

  10. NSDate如何获取一个月后的日期

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateCo ...