2016HUAS_ACM暑假集训3B - Frogger
好几天没更新博客了,因为这周在看关于图论的算法,有好几个(还是英文名字-_-||),人晕晕的......
说一下这个Frogger吧。这个题目的话......难的不是做法,而是题意。。。
大致题意:有两只青蛙A和B,都在湖里的石头上(湖里还有其他石头),现在A要去B的位置,方法是借助其他石头跳过去,求的是所有可达路径中,权值(石头之间的距离)最大的是多少。
每组案例的第一组和第二组数据分别是青蛙A和青蛙B的坐标。这么说吧,求最小生成树的最大权。
尴尬的是写的是混合语言啊,不会用操纵符(-_-||)。新手,对算法还不是很了解,请多多体谅!!!
Sample Input
2 // 石头(点)的个数N,下面N行是石头的坐标
0 0
3 4
17 4
19 4
18 5
Sample Output(注意结果从#1开始,并且每次输出空一行,结果保留三位小数)
Scenario #1 Frog Distance = 5.000
Scenario #2 Frog Distance = 1.414
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define size 220
using namespace std; struct point//石头(图的顶点)
{
double x,y;
}p[size]; double stone[size][size],dis[size];//一个存图,一个存点之间的距离(权)
int N,T,i,j,flag[size];//flag存标记的
double a,b,ans,tem,minx; double distance(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//两点之间的距离
} void Init()//初始化两个数组
{
memset(flag,,sizeof(flag));
memset(stone,,sizeof(stone));
} double Prim()
{
ans=;
int key;
double temp=0xfffffff;//先来一个大数
for(i=;i<=N;i++)
dis[i]=stone[][i];//存上各自的距离(权)
flag[]=;//咱们先从1号位置开始遍历
for(i=;i<N;i++)
{
minx=temp;
for(j=;j<=N;j++)
if(flag[j]!=&&dis[j]<minx)//找到没有遍历过的点并且它周围权值最小的边
{
minx=dis[j];//把这条边的权设置为最小,下次就跟它比较了
key=j;//记录一下这个点
}
if(ans<minx)
ans=minx;//记录一下距离
if(key==)//到终点了,结束
break;
flag[key]=;//这个点已经来过了
for(int j=;j<=N;j++)//维护这棵树(取权值较小的)
{
if(flag[j]!=&&stone[key][j]<dis[j])
dis[j]=stone[key][j];
}
}
return ans;
} int main()
{
T=;
while((cin>>N),N)
{
Init();
for(i=;i<=N;i++)
cin>>p[i].x>>p[i].y;//输入坐标
for(i=;i<=N;i++)
for(j=;j<=N;j++)
stone[i][j]=stone[j][i]=distance(p[i].x,p[i].y,p[j].x,p[j].y);//两点的距离(a到b等效b到a)
cout<<"Scenario #"<<T<<endl;
printf("Frog Distance = %.3lf\n",Prim());//这里有点尴尬(-_-||)
cout<<endl;
T++;
}
return ;
}
2016HUAS_ACM暑假集训3B - Frogger的更多相关文章
- 2016HUAS_ACM暑假集训4C - 递推
题目大意:给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形. 这里我们可以这样看: 对于行:假如是m单位长度,则长度为1的矩形有m个,长度为2的矩形有m-1个......长度为m的只有1 ...
- 2016HUAS_ACM暑假集训4A - 递推
利用组合公式C(n,m)=C(n-1,m)+C(n-1,m-1).也就是从n个数里面选择m个数.按递增方式放在每一层循环. 杨辉三角+二项式定理,还真是挺有“意思”的一道题.说实话,非原创.见谅... ...
- 2016HUAS_ACM暑假集训4D - 计数,排列
一个错排公式的基础应用. 大致题意:求n个数的错误排列方式.(每个都要错) 在这里先贴一下错排公式:D(1)=0:D(2)=1:D(n)=(n-1)*(D(n-1)+D(n-2)) 它的推导也非常有意 ...
- 2016HUAS_ACM暑假集训4M - 基础DP
简单的0-1背包问题,大家都会做的.题意不想解释太多. 简述题目的案例及以几个关键 Sample Input 1 //测试组数T 5 10 ...
- 2016HUAS_ACM暑假集训4K - 基础DP
我不知道怎么用DP,不过DFS挺好用.DFS思路很明显,搜索.记录,如果刚好找到总价值的一半就说明搜索成功. 题目大意:每组6个数,分别表示价值1到6的物品个数.现在问你能不能根据价值均分. Samp ...
- 2016HUAS_ACM暑假集训4F - 数论
这个题目,如果没找到方向,确实有点一头雾水.但是如果你找对方向了,AC是分分钟的事.答案就是看n和m是否有除1之外的公约数. 简单证明:设n和m最大公约数不是1,假设为p.n和m总可以化为一个数乘以k ...
- 2016HUAS_ACM暑假集训4B - 递推
这种数学推理题目题意极其明显,在做的时候,可以多写几组,这样找起规律来会容易些.概括起来就是:题意简单暴力,案例毫无价值. 一个三角形最多可以把一个平面分成两部分,两个三角形最多是8(2+6)部分,而 ...
- 2016HUAS_ACM暑假集训3G - 还是畅通工程
最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3 //村庄个数1 2 1 ...
- 2016HUAS_ACM暑假集训3F - Jungle Roads
这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试).题意简单直接,给你一个图,求出它最小生成树的权值. 题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了. Sample ...
随机推荐
- Json2JsonArray JsonArray2StringArray
public String[] json2JsonArray(String str){ JSONArray jsonArray = JSONArray.fromObject(str); String[ ...
- lamp centos虚拟主机配置
1.基于不同端口的虚拟主机配置 [root@lamp~]# vi /etc/httpd/conf/httpd.conf Listen 80 #设置监听不同的虚拟主机需要使用的端口 Liste ...
- 程序设计入门——C语言 第3周编程练习 2 数字特征值(5分)
2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...
- JavaScript笔记三两个
JavaScript定义变量: var num;变量的类型不知道,当给num赋值后,根据值类型来确定类型. var num = 3; //数值类型 var str = "hello,worl ...
- 导出Excel 有身份证时注意
if (this.GridView1.Rows.Count != 0) { HttpContext.Current.Response.Clear() ...
- MVP 个人理解2
根据我的理解,画了个图 这次又看了下 较复杂点的例子. 往往一个项目有多个部份,我们可以按功能分成几个activity, 每个activity有自己的view和数据model,因此也有自己的逻辑 pr ...
- Java 概述
一 Java 程序的种类 1)Java 小应用程序(Java Applet) — 在Web浏览器中运行(内嵌Java虚拟机) —特定标记 <APPLET CODE="HelloWorl ...
- iOS开发Swift篇—(一)简单介绍
iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...
- iOS开发多线程篇—创建线程
iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...
- 获取数据库里面最新的ID
你如果新插入的一段资料,你想获取它的ID,就用 “mysql_insert_id()”; 并且要重新定义一个名称