Highways(POJ—2485)

简介: Highways(POJ—2485)

题目:

Flatopia岛国完全平坦。不幸的是,Flatopia的公共高速公路系统非常糟糕。弗拉托利亚政府意识到了这个问题,并且已经建造了一些连接一些最重要城镇的高速公路。但是,仍有一些城镇无法通过高速公路抵达。有必要建造更多的高速公路,以便能够在不离开高速公路系统的情况下在任何一对城镇之间行驶。

Flatopian城镇的编号从1到N,城镇i的位置由笛卡尔坐标(xi,yi)给出。每条高速公路连接两个城镇。所有高速公路(原始高速公路和要建造的高速公路)都遵循直线,因此它们的长度等于城镇之间的笛卡尔距离。所有高速公路都可以在两个方向使用。高速公路可以自由地相互交叉,但司机只能在位于两条高速公路尽头的小镇的高速公路之间切换。

Flatopian政府希望最大限度地降低建设新高速公路的成本。但是,他们希望保证每个城镇都可以从其他城镇到达公路。由于Flatopia是如此平坦,高速公路的成本总是与其长度成正比。因此,最便宜的高速公路系统将是最小化总公路长度的系统。

Input

输入包括两部分。第一部分描述了该国的所有城镇,第二部分描述了所有已建成的高速公路。

输入文件的第一行包含一个整数N(1 <= N <= 750),表示城镇数量。接下来的N行每行包含两个整数,xi和yi由空格分隔。这些值给出了第i个城镇的坐标(对于i从1到N)。坐标的绝对值不超过10000.每个城镇都有一个独特的位置。

下一行包含单个整数M(0 <= M <= 1000),表示现有高速公路的数量。接下来的M行每行包含一对由空格分隔的整数。这两个整数给出了一对已经通过高速公路连接的城镇号码。每对城镇至少由一条高速公路连接。

Output

为每条新高速公路写一条输出线,以便连接所有城镇,尽可能减少新高速公路的总长度。每条高速公路都应该通过打印这条高速公路连接的城镇号码来展示,并以空间隔开。

如果不需要建立新的高速公路(所有城镇都已连接),则应创建输出文件,但应该为空。

Sample Input

9
1 5
0 0 
3 2
4 5
5 1
0 4
5 2
1 2
5 3
3
1 3
9 7
1 2

Sample Output

1 6
3 7
4 9
5 7
8 3

解题思路:给定n 个点的坐标,然后又给m个边表示该两个点已经连接起来不需要再建立高速公路。这个题考察的是Prim最短生成树算法,不过该题不是让我们求的是最短总距离,而是求出每一次所建立的边,既头结点和当前结点。

Code:

#include<stdio.h>
#include<string.h>
#include<math.h>
struct node
{
  int x;
  int y;  
}q[2000];
int e[2000][2000],book[5000],dis[50000],f[50000];//f[]是记录头结点的
int inf=999999999;
int count,sum;
int main()
{
  int i,j,k,min,n,m,b,t1,t2;
  while(scanf("%d",&n)!=EOF)
  {
    count=0;
    memset(book,0,sizeof(book));
    memset(dis,0,sizeof(dis));
    memset(f,0,sizeof(f));//数组清零
    for(i=1;i<=n;i++)
      scanf("%d%d",&q[i].x,&q[i].y);
    scanf("%d",&m);

    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        if(i==j)  e[i][j]=0;
        else        e[i][j]=inf;
    for(i=1;i<n;i++)
      for(j=i+1;j<=n;j++)
        e[i][j]=e[j][i]=((q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y));
    for(i=1;i<=m;i++)
    {
      scanf("%d%d",&t1,&t2);//已经建立的点就让两点之间距离的边为0
      e[t1][t2]=e[t2][t1]=0;
    }
    for(i=1;i<=n;i++)
      f[i]=1;//初始让所有头结点都为 1
    for(i=1;i<=n;i++)
      dis[i]=e[1][i];
    book[1]=1;
    count++;
    while(count<n)
    {
      min=inf;
      for(i=1;i<=n;i++)
      {
        if(book[i]==0&&dis[i]<min)
        {
          min=dis[i];
          j=i;
        }
      }
      book[j]=1;
      count++;
      if(e[f[j]][j]!=0)//输出要建立所要建立边的两点
        printf("%d %d\n",f[j],j);
      for(k=1;k<=n;k++)
      {
        if(book[k]==0&&dis[k]>e[j][k])
        {
          dis[k]=e[j][k];
          f[k]=j;//更新头结点
        } 
      }
    }   
  }
  return 0;
}

注意:题中的样例给出是随机的,也就是说求得的样例只要所对应的边一样就行了。

相关文章
|
监控 应用服务中间件 API
API 网关的功能用途及实现方式
API 网关的功能用途及实现方式
|
3月前
|
人工智能 自然语言处理 安全
阿里云上线团队版Token Plan:一站式多模型订阅,解决企业规模化AI使用难题
阿里云上线团队版Token Plan,内置Qwen3.6、Kimi-K2.6等十余款主流多模态模型,支持坐席灵活分配、成本管控与多租户隔离,兼容Qoder、Cursor等主流Agent工具,提供标准/高级/尊享三档套餐,一站式解决企业AI规模化使用痛点。
428 1
|
4月前
|
运维 架构师 Java
架构设计的权衡:微服务、模块化与单体在Java生态中的选择
在Java架构设计中,微服务架构在过去十年间经历了从狂热追捧到理性回归的演变。2015年前后,“微服务”几乎成了先进架构的代名词——任何新项目如果不用微服务,似乎就落后于时代。
359 2
|
11月前
|
人工智能 开发者 异构计算
魔搭勋章权益全面升级,免费工位+魔搭周边+GPU时长…统统安排!
亲爱的搭搭搭塔子们~(不是)你听说了吗?现在魔搭社区要给每一位搭友发!福!利!
440 1
|
程序员 编译器 C语言
C++风格与C风格类型强转异同
C++风格的强转: C++强制类型转换 C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下: 目标类型 b = (目标类型) a; C++也是支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。 在C++中,新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用于支持C++风格的强制类型转换。 C++风格的强制类型转换能更清晰的表明它们要干什么,程序员只要看一眼这样的代码,立即
523 0
|
Android开发 Kotlin
kotlin安卓开发【Jetpack Compose】:封装SnackBarUtil工具类方便使用
GPT-4o 是一个非常智能的模型,比当前的通义千问最新版本在能力上有显著提升。作者让GPT开发一段代码,功能为在 Kotlin 中使用 Jetpack Compose 框架封装一个 Snackbar 工具类,方便调用
1222 13
|
前端开发 JavaScript 中间件
基于最新koa的Node.js后端API架构与MVC模式
基于最新koa的Node.js后端API架构与MVC模式
810 1
|
移动开发 安全 关系型数据库
Weblogic任意文件上传漏洞(CVE-2018-2894)复现
Weblogic任意文件上传漏洞(CVE-2018-2894)复现 漏洞背景 WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,可直接获取权限。
4282 0
|
测试技术 Python Java
《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教程)
【6月更文挑战第2天】本文介绍了使用Java + Selenium进行自动化测试时如何截图指定元素或目标区域。通过访问百度首页,点击设置并进入搜索设置页面,然后调用截图类截取并保存该页面的特定部分。代码示例展示了如何捕获元素的图像,并提供了截图功能的实现。最终,文章还展示了代码运行后的控制台输出、保存的截图以及浏览器的实际操作效果。
412 0
|
安全 JavaScript 前端开发
第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题—B模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一次网络安全演练,包括七个部分:Linux渗透提权、内存取证、页面信息发现、数字取证调查、网络安全应急响应、Python代码分析和逆向分析。参与者需在模拟环境中收集Flag值,涉及任务如获取服务器信息、提权、解析内存片段、分析网络数据包、处理代码漏洞、解码逆向操作等。每个部分都列出了若干具体任务,要求提取或生成特定信息作为Flag提交。
600 0