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 ...
随机推荐
- Apache+Nginx+php共存(一)
在实际开发中个人的电脑中经常需要安装 WNMRP.WAMRP.LNMRP.LAMRP等各种开发环境来应对不同的开发需求. 此篇主要是对WINDOWS系统下 Apache+Nginx + PHP +My ...
- Android 去掉标题全屏显示
自己测试时出现无法实现去掉标题和全屏功能.最后发现只要public class SocketActivity extends Activity {} 而不能用ActionBarActivity. 先介 ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- screen.height && screen.width
screen.height && screen.width how to get window max width in js screen.height; screen.width; ...
- HDU3452_Bonsai
题目的意思是给你一个棵树,每天边上有一个权值,现在要想根节点和每个叶子节点完全隔离开来,删除一些边,求最少需要删除的边权值综合是多少? 直接建模,以根节点为汇点,每个叶子节点连接虚拟源点流量无穷,树上 ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1085 Solved: 604[Submit][S ...
- Java考试题之七
QUESTION 150 Click the Exhibit button. Given: ClassA a = new ClassA(); a.methodA(); What is the resu ...
- 面试自我介绍之English
Version 1 Hello, everyone. I am so glad to stand here. First of all, I will introduce myself. My nam ...
- IDA error of " positive sp value has been found"
问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有? 答:endp ; sp-analysis fai ...
- mysqldump导出多个数据库
mysqldump -uroot -p111111 -q -e -R -x --databases account game_s1 game_s2 ...... > D:\backup.sql ...