Agri-Net
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 37131   Accepted: 14998

Description

Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. 

Farmer John ordered a high speed connection for his farm and is going to share his connectivity with the other farmers. To minimize cost, he wants to lay the minimum amount of optical fiber to connect his farm to all the other farms. 

Given a list of how much fiber it takes to connect each pair of farms, you must find the minimum amount of fiber needed to connect them all together. Each farm must connect to some other farm such that a packet can flow from any one farm to any other farm. 

The distance between any two farms will not exceed 100,000. 

Input

The input includes several cases. For each case, the first line contains the number of farms, N (3 <= N <= 100). The following lines contain the N x N conectivity matrix, where each element shows the distance from on farm to another. Logically, they are N lines
of N space-separated integers. Physically, they are limited in length to 80 characters, so some lines continue onto others. Of course, the diagonal will be 0, since the distance from farm i to itself is not interesting for this problem.

Output

For each case, output a single integer length that is the sum of the minimum length of fiber required to connect the entire set of farms.

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output

28

Source

代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=5010;
int parent[110];
int n; struct Node
{
int from,to,edge;
}node[maxn]; void init(int n)
{
for(int i=1;i<=n;i++)
parent[i]=i;
} int find(int x)
{
return parent[x]==x?x:find(parent[x]);
} bool cmp(Node a,Node b)
{
if(a.edge<b.edge)
return true;
return false;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
int m=1;
int len;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&len);
if(i<j)
{
int temp=m;
node[temp].from=i;
node[temp].to=j;
node[temp].edge=len;
m++;
}
}
init(n);
m=n*(n-1)/2;
len=0;
sort(node+1,node+1+m,cmp);
for(int i=1;i<=m;i++)
{
int x=find(node[i].from);
int y=find(node[i].to);
if(x==y)
continue;
else
{
len+=node[i].edge;
parent[x]=y;
}
}
printf("%d\n",len);
}
return 0;
}

prim算法:

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=110;
const int inf=0x7fffffff;
int map[maxn][maxn],low[maxn],visit[maxn];
//map数组用来记录地图,low数组用来保存与已增加树中的顶点相连的边。(保证权值最小的肯定在里边)。visit用来记录该顶点是否已增加树中
int n; int prim()
{
int pos,Min,result=0;
memset(visit,0,sizeof(visit));
visit[1]=1,pos=1;//首先找的是1这个顶点,增加图中
for(int i=1;i<=n;i++)
if(i!=pos)
low[i]=map[pos][i];//与1顶点相连的边地权值
for(int i=1;i<n;i++)//每次增加一条边。n个顶点增加n-1条边。循环n-1次就能够了
{
Min=inf;
for(int j=1;j<=n;j++)
if(!visit[j]&&Min>low[j])
{
Min=low[j];//Min找到的是与已增加图中的顶点相连的边的最小值
pos=j;//该顶点为j
}
result+=Min;//加上最小边
visit[pos]=1;//新的顶点位置
for(int j=1;j<=n;j++)
if(!visit[j]&&low[j]>map[pos][j])
low[j]=map[pos][j];//更新low[]值,新的与图中已有的点相连的边,假设比原来小的,就更新
}
return result;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
map[j][i]=map[i][j];
}
//对于题目中输入了map[i][i]的值的话。map数组不用预处理,假设没输入,那么memset(map,0x3f3f3f3f,sizeof(map));最大化处理
cout<<prim()<<endl;
}
return 0;
}

[ACM] poj 1258 Agri-Net (最小生成树)的更多相关文章

  1. POJ 1258 Agri-Net (最小生成树)

    Agri-Net 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/H Description Farmer John has be ...

  2. POJ 1258 Agri-Net(最小生成树,模板题)

    用的是prim算法. 我用vector数组,每次求最小的dis时,不需要遍历所有的点,只需要遍历之前加入到vector数组中的点(即dis[v]!=INF的点).但其实时间也差不多,和遍历所有的点的方 ...

  3. POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)

    题目链接: 传送门 Agri-Net Time Limit: 1000MS     Memory Limit: 10000K Description Farmer John has been elec ...

  4. POJ 1258 Agri-Net(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math ...

  5. poj 1258 Agri-Net【最小生成树(prime算法)】

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44827   Accepted: 18351 Descri ...

  6. POJ 2485 Highways【最小生成树最大权——简单模板】

    链接: http://poj.org/problem?id=2485 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  7. poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题

    poj 1251  && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...

  8. 最小生成树 10.1.5.253 1505 poj 1258 http://poj.org/problem?id=1258

    #include <iostream>// poj 1258 10.1.5.253 1505 using namespace std; #define N 105 // 顶点的最大个数 ( ...

  9. 北大ACM - POJ试题分类(转自EXP)

    北大ACM - POJ试题分类 -- By EXP 2017-12-03 转载请注明出处: by EXP http://exp-blog.com/2018/06/28/pid-38/ 相关推荐文: 旧 ...

随机推荐

  1. HDU4850 构造一个长度n串,它需要随机长度4子是不相同

    n<=50W.(使用26快报) 构造函数:26一个.截至构建26^4不同的字符串,最长的长度26^4+3.如此之大的输出"impossble",被判重量的四维阵列. 在正向结 ...

  2. jquery-easyui实现页面布局和增删改查操作(SSH2框架支持)转载

    http://blessht.iteye.com/blog/1069749/ 已注册:ooip 关联的csdn 前几天心血来潮用jquery-easyui+spring.struts2.hiberna ...

  3. ASP.NET - 网页重定向 Response.Redirect()

    在网页中使用重定向,意思就是在网站中的某一个页面跳转到另一个页面. Response.Redirect(~/abc.aspx); 使用“~”的作用是可以从任意位置跳转. 如果没有“~”,那么跳转的时候 ...

  4. MSSQL - 存储过程取出5条热点新闻

    USE [DB_News] GO /****** Object: StoredProcedure [dbo].[SelectHotNews] Script Date: 2015/7/8 13:34:4 ...

  5. SQL Server使用问题总结

    1.datetime,smalldatetime,date的区别 1)datetime 从1753年1月1日到9999年12月31日的日期和时间数据,精确度为百分之三秒(等于   3.33毫秒或0.0 ...

  6. post 请求参数

    perl代码: my $login_url='http://192.168.1.1/getpage.gch?pid=1001&logout=1'; my $res = $ua->post ...

  7. css盒模型和块级、行内元素深入理解

    盒模型是CSS的核心知识点之一,它指定元素如何显示以及如何相互交互.页面上的每个元素都被看成一个矩形框,这个框由元素的内容.内边距.边框和外边距组成,需要了解的朋友可以深入参考下 一.CSS盒模型 盒 ...

  8. Android 通过wifi调试程序【转】

    1.首先让android手机监听指定的端口: 这一步需要使用shell,因此手机上要有终端模拟器,不过网上很多,随便找个就行了,依次敲入下列几行: ? su//获取root权限 setprop ser ...

  9. Ajax - 异步处理(点击变成文本框并修改)

    效果: 对应的文档结构: Test.aspx 前台代码: 引入JQuery(jquery-1.8.3.min.js). 引入自己所写的JS代码(UserJS.js). <html xmlns=& ...

  10. 使用TWebBrowser时存在内存泄漏问题的解决方案(使用SetProcessWorkingSetSize函数,或者修改OleCtrls.pas源码解决问题)

    用TWebBrower不断打开多个网页,多某些版本的操作系统上运行一段时间后,发现占用系统内存达几百M,直到关闭程序后,占用的内存才能释放. 这个问题在网有很多讨论,比较多人的建议办法是用SetPro ...