POJ 2485 Highways( 最小生成树)
Description
The islandnation of Flatopia is perfectly flat. Unfortunately, Flatopia has no publichighways. So the traffic is difficult in Flatopia. The Flatopian government isaware of this problem. They're planning to build some highways so that it willbe possible to drive between any pair of towns without leaving the highwaysystem.
Flatopian towns are numbered from 1 to N. Each highway connects exactly twotowns. All highways follow straight lines. All highways can be used in bothdirections. Highways can freely cross each other, but a driver can only switchbetween highways at a town that is located at the end of both highways.
The Flatopian government wants to minimize the length of the longest highway tobe built. However, they want to guarantee that every town is highway-reachablefrom every other town.
Input
The firstline of input is an integer T, which tells how many test cases followed.
The first line of each case is an integer N (3 <= N <= 500), which is thenumber of villages. Then come N lines, the i-th of which contains N integers,and the j-th of these N integers is the distance (the distance should be aninteger within [1, 65536]) between village i and village j. There is an emptyline after each test case.
Output
For eachtest case, you should output a line contains an integer, which is the length ofthe longest road to be built such that all the villages are connected, and thisvalue is minimum.
Sample Input
1
3
0 990 692
990 0 179
692 179 0
Sample Output
692
分析:
最小生成树问题,但不是求边的权值之和,而是求最小生成树中最长的那条边的长度。用Prim算法和Kruskal算法均可以。由于题目的测试数据是以邻接矩阵的形式给出的,因此可以考虑优先使用Prim算法。如果使用Kruskal算法,还需要把邻接矩阵中的顶点和边分离出来。
prim代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int n;
int tu[505][505];
int dis[505],vis[505];
void prim()
{
for(int i=1;i<=n;i++)//初始化,所有点的距离以及是否访问过
{
dis[i]=tu[1][i];
vis[i]=0;
}
vis[1]=1;//标记1号顶点已经访问过
int Min;
int k;
int ans=0;//保存最小生成树里面的最大边
//int sun=0;//最小生成树的值
for(int i=1;i<n;i++)
{
Min=0x3f3f3f3f;
for(int j=1;j<=n;j++)
{
if(vis[j]==0&&Min>dis[j])
{
Min=dis[j];
k=j;
}
}
if(ans<dis[k])
ans=dis[k];
vis[k]=1;//标记k这个点已经访问过
//sum+=dis[k];
for(int j=1;j<=n;j++)
{
if(vis[j]==0&&dis[j]>tu[k][j])
dis[j]=tu[k][j];
}
}
printf("%d\n",ans);
//printf("%d\n",sum);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&tu[i][j]);
prim();
}
}
Kruskal算法:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int Count;
int tu[505][505];
int Tree[505];//并查集的数组
struct Node
{
int a,b,w;
} node[505*505];
bool cmp(Node A,Node B)
{
if(A.w!=B.w)
return A.w<B.w;
if(A.a!=B.a)
return A.a<B.a;
return A.b<B.b;
}
int findRoot(int x) //递归查找顶点x所在树的根
{
if (Tree[x] == x) return x;//若为x,则x的根就是自身
else //否则
{
int tmp =findRoot(Tree[x]);//递归查找x的父亲Tree[x]的根,tmp为最终的树根
Tree[x]= tmp; //查找过程中进行路径压缩:把x到根之间遇到的所有顶点的父亲设为tmp
return tmp; //返回树根
}
}
void Kruskal()
{
int ans=0;
int k=0;
int sum=0;
for(int i=0; i<Count; i++)//遍历排序好的每一条边
{
if(k==n-1) break;//如果当前的生成树中已经有了n-1条边,就不用在接着往下找了
int a=findRoot(node[i].a);
int b=findRoot(node[i].b);
if(a!=b)
{
k++;
Tree[a]=b;
//sum+=node[i].w;
if(ans<node[i].w)
ans=node[i].w;
}
}
printf("%d\n",ans);
//printf("%d\n",sum);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
scanf("%d",&tu[i][j]);
}
for(int i=1; i<=n; i++)
Tree[i]=i;//标记没一个点都是只属于自身的集合
Count=0;
for(int i=1; i<=n; i++)
for(int j=1; j<i; j++)
{
node[Count].a=i;
node[Count].b=j;
node[Count].w=tu[i][j];
Count++;
}
sort(node,node+Count,cmp);
Kruskal();
}
return 0;
}
POJ 2485 Highways( 最小生成树)的更多相关文章
- POJ 2485 Highways(最小生成树+ 输出该最小生成树里的最长的边权)
...
- POJ 2485 Highways 最小生成树 (Kruskal)
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- poj 2485 Highways 最小生成树
点击打开链接 Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19004 Accepted: 8815 ...
- poj 2485 Highways (最小生成树)
链接:poj 2485 题意:输入n个城镇相互之间的距离,输出将n个城镇连通费用最小的方案中修的最长的路的长度 这个也是最小生成树的题,仅仅只是要求的不是最小价值,而是最小生成树中的最大权值.仅仅须要 ...
- poj 2485 Highways
题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...
- POJ 2485 Highways【最小生成树最大权——简单模板】
链接: http://poj.org/problem?id=2485 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ 2485 Highways (求最小生成树中最大的边)
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- POJ 2485 Highways (prim最小生成树)
对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...
- poj 2485 Highways(最小生成树,基础,最大边权)
题目 //听说听木看懂之后,数据很水,我看看能不能水过 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stri ...
随机推荐
- 性能分析_linux服务器CPU_CPU利用率
CPU度量 1. 指标范围 1.1 User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...
- 动态生成lookup字段
var i: Integer;begin //ADOQuery已打开 //在数据集打开的情况下新增加一个字段 with Self.ADOQuery1 do begin TDataSe ...
- 9款最佳的Linux文件比较工具
程序员和撰稿人在编写程序文件或平常的文本文件时,有时想知道两个文件或同一文件的两个版本之间的差异.你在Linux上比较两个计算机文件时,文件内容之间的差异就叫diff.这一描述来源于提到diff的输出 ...
- linux下tomcat、jenkins环境搭建
1.安装JDK 我不列出来了,自行百度 java -version 2.安装tomcat (1)将下载的tomcat压缩包 tar -zxvf apache-tomcat-8.5.29.tar.gz ...
- Eclipse中设置新创建文件的默认编码格式
window-prefenences-web-jsp(或者是其他文件格式,里面是一个列表) 找到之后点击,在右侧区域中选择encoding进行修改即可,然后应用,OK
- [Codeforces526F]Pudding Monsters 分治
F. Pudding Monsters time limit per test 2 seconds memory limit per test 256 megabytes In this proble ...
- VSS2005 上传pdf 空白
加补丁 VS80-KB943847-X86-INTL.exe
- 【BZOJ1922】大陆争霸(最短路)
[BZOJ1922]大陆争霸(最短路) 题面 BZOJ 洛谷 题解 最短路变形题. 定义\(dis\)表示最短路,\(d\)表示最早可以进入当前点的时间.显然\(d=max(max(dis_v,d_v ...
- 【UOJ#80】二分图最大权匹配(KM)
题面 UOJ 题解 模板qaq #include<iostream> #include<cstdio> #include<cstdlib> #include< ...
- 【BZOJ3309】DZY Loves Math 解题报告
[BZOJ3309]DZY Loves Math Description 对于正整数\(n\),定义\(f(n)\)为\(n\)所含质因子的最大幂指数.例如\(f(1960)=f(2^3×5^1×7^ ...