AYIT2017暑假集训第二周周三赛 C - Highways POJ - 1751

本文介绍了一个关于构建最小生成树的实际问题案例。在一个名为Flatopia的岛国中,需要通过建设新的公路连接各个城镇,使得任意两个城镇都能通过公路相连,并且总公路长度最短。文章提供了具体的算法实现思路及代码示例。
The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system of public highways. The Flatopian government is aware of this problem and has already constructed a number of highways connecting some of the most important towns. However, there are still some towns that you can't reach via a highway. It is necessary to build more highways so that it will be possible to drive between any pair of towns without leaving the highway system. 

Flatopian towns are numbered from 1 to N and town i has a position given by the Cartesian coordinates (xi, yi). Each highway connects exaclty two towns. All highways (both the original ones and the ones that are to be built) follow straight lines, and thus their length is equal to Cartesian distance between towns. All highways can be used in both directions. Highways can freely cross each other, but a driver can only switch between highways at a town that is located at the end of both highways. 

The Flatopian government wants to minimize the cost of building new highways. However, they want to guarantee that every town is highway-reachable from every other town. Since Flatopia is so flat, the cost of a highway is always proportional to its length. Thus, the least expensive highway system will be the one that minimizes the total highways length. 
Input
The input consists of two parts. The first part describes all towns in the country, and the second part describes all of the highways that have already been built. 

The first line of the input file contains a single integer N (1 <= N <= 750), representing the number of towns. The next N lines each contain two integers, xi and yi separated by a space. These values give the coordinates of i th town (for i from 1 to N). Coordinates will have an absolute value no greater than 10000. Every town has a unique location. 

The next line contains a single integer M (0 <= M <= 1000), representing the number of existing highways. The next M lines each contain a pair of integers separated by a space. These two integers give a pair of town numbers which are already connected by a highway. Each pair of towns is connected by at most one highway. 
Output
Write to the output a single line for each new highway that should be built in order to connect all towns with minimal possible total length of new highways. Each highway should be presented by printing town numbers that this highway connects, separated by a space. 

If no new highways need to be built (all towns are already connected), then the output file should be created but it should be empty. 
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
很无语的一道题,题目说的是给你几个点并且把点坐标给你,然后又给你说哪几条路建好了,然后让你输出剩下还需要建的,就是最小生成树问题。
这道题不知道为什么在输入已经建好的路的时候用while会出错,虽然答案一样,但是用while会超时,for就不会
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct note//存储点坐标和点与点之间的长度
{
    int x,y;
    double w;
} l[2000000];
struct st//存储点坐标
{
    int u,v;
} l1[2000000];
int f[2000];//存储根节点
double cmp(note a,note b)//比较函数,因为算的是距离,所以用浮点型
{
    return a.w<b.w;
}
int gf(int v)//找根的递归函数
{
    if(f[v]==v)
        return v;
    else
    {
        f[v]=gf(f[v]);
        return f[v];
    }
}

int mer(int v,int u)//对树进行合并
{
    int t1,t2;
    t1=gf(v);
    t2=gf(u);
    if(t1!=t2)
    {
        f[t2]=t1;
        return 1;
    }
    return 0;
}
int main()
{
    int a,b,j,n,m,i;
    while(~scanf("%d",&n))//输入有几个点
    {
        for(i=1; i<=n; i++)//输入点坐标
        {
            scanf("%d%d",&l1[i].u,&l1[i].v);
            f[i]=i;//初始化各个顶点的根
        }
        int ca=0;
        for(i=1; i<=n; i++)//计算两点之间距离并进行存储
        {
            for(j=i+1; j<=n; j++)
            {
                l[ca].x=i;
                l[ca].y=j;
                l[ca++].w=(l1[i].u-l1[j].u)*(l1[i].u-l1[j].u)+(l1[i].v-l1[j].v)*(l1[i].v-l1[j].v);
                l[ca].x=j;
                l[ca].y=i;
                l[ca++].w=(l1[i].u-l1[j].u)*(l1[i].u-l1[j].u)+(l1[i].v-l1[j].v)*(l1[i].v-l1[j].v);
            }
        }
        scanf("%d",&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);//输入已经建好的路,并对其进行
            mer(a,b);
        }
        sort(l,l+ca,cmp);
        int count1=0;
        for(i=0;i<ca;i++)
        {
            if(mer(l[i].x,l[i].y))
            {
                printf("%d %d\n",l[i].x,l[i].y);
                count1++;
            }
            if(count1==n-1)break;
        }
        //if(count1==0)
          //  printf("\n");
    }
    return 0;
}


一. 单选题(共30题,85.5分) 1. (单选题) 创建一个到百度的链接,打开页面在新打开的窗口中,可以实现的代码是( )。 A "<a href='http://www.baidu.com' target='_blank'>百度</a>" B "<a href='http://www.baidu.com' target='_self'>百度</a>" 2. (单选题) 在使用iframe这个标签时,需要设置浮动框架的边框显示,设置的属性是() A frameborder B border 3. (单选题) 通过超级链接执行JavaScript语句“alert('你好!欢迎访问我的网站!');”,源端点为文本“执行JavaScript脚本”。可以实现的代码是( ) A “<a href="alert('你好!欢迎访问我的网站!')">执行JavaScript脚本</a>” B “<a href="Javascript:alert('你好!欢迎访问我的网站!')">执行JavaScript脚本</a>” 4. (单选题) 在HTML中,下列哪个元素属于块级元素? A div B a C span D strong 5. (单选题) 能显示如下图所示的无序列表的代码是( ) A " <ul type= "disc" > <li>java </li> <li>C++ </li> <li>python </li> </ul>" B " <ul type= "circle" > <li>java </li> <li>C++ </li> <li>python </li> </ul>" 6. (单选题) 声明有序列表用( )标签。 A <ul> B <dd> C <dl> D <ol> 7. (单选题) 声明无序列表用( )标签。 A <ol> B <ul> C <div> D <em> 8. (单选题) 下列关于HTML元素的说法中,哪一项是正确的? A 块级元素无法嵌套其他元素 B 块级元素默认不会换行 C 行内元素通常用于包裹文本内容 D 行内元素可以设置宽度和高度 9. (单选题) 以下元素是行内元素的有( )。 A span B img C h1~h6 D div 10. (单选题) 以下是块级元素的是( ) A img B p C em D span 11. (单选题) 创建无序列表,需要使用的标签是( ) A ol和dd B ol、dt和dd C ol和li D ul和li 12. (单选题) 以下关于div标签描述不正确的是( ) A div能设置宽度和高度 B div是一个块级元素 C div是一个容器元素 D div不能设置内边距和外边距 13. (单选题) 能显示如下图所示的有序列表的代码是( )。 A " <ol> <li>java </li> <li>C++ </li> <li>python </li> </ol> " B " <ul> <li>java </li> <li>C++ </li> <li>python </li> </ul>" 14. (单选题) 能够实现在浏览器中打开文档的显示的代码是() A "<a href="resource/download.txt">文本显示</a>" B "<a href="resource/download.docx">文本显示</a>" 15. (单选题) 设置页面的基准url为"https://www.ayit.edu.cn" 并且链接打开都在新窗口中,可以实现的代码是( ) A "<base href="https://www.ayit.edu.cn"></base>" B "<base href="https://www.ayit.edu.cn" target="_blank">" 16. (单选题) 在设置有序列表的列表项标号为小写罗马字符是用的属性和值是( ) A "type=a" B "type=A" C "type=I" D "type=i" 17. (单选题) 创建超链接必须具备的条件是同时存在() A 目标端点和href属性 B 源端点和目标端点 18. (单选题) 创建一个超级链接,链接地址为“http://www.baidu.com”,在新窗口内打开页面,显示文本为“百度搜索”,当鼠标放在链接上时显示“你要找什么?,代码可以实现的是() A " <a href="http://www.baidu.com" target="_blank" alt="你要找什么?">百度搜索</a>" B " <a href="http://www.baidu.com" target="_blank" title="你要找什么?">百度搜索</a>" 19. (单选题) 使用超级链接实现在页面标题1处创建书签,书签名为“head”,可以实现的代码是( )。 A “<a href="head"> <h1>标题1</h1> </a>” B “<a id="head"> <h1>标题1</h1> </a>” 20. (单选题) 在使用a标签跳转到书签位置时,创建超级链接可以实现的代码是() A "<a id='#head'>跳转到头部</a>" B "<a href='#head'>跳转到头部</a>" 21. (单选题) 以下关于块级元素描述不正确的是( ) A 块级元素不能设置宽度和高度 B 块级元素不设置宽度样式时,宽度自动撑满父元素宽度 C 块级元素和相邻的块级元素依次垂直排列 D 块级元素独占一行 22. (单选题) 以下标签中,都是块级元素的是( ) A img、span、div B span、div、p C img、div 、p D div 、p、h1 23. (单选题) 在无序列表中,定义列表项用( )标签。 A <ol> B <dd> C <tr> D <li> 24. (单选题) 设置有序列表的列表标号起始编号为3,设置的属性和值是( ) A "type=3" B "start=3" 25. (单选题) 使目标端点在新打开的窗口显示,可以实现的代码是() A "<a href='a001.htm' target=_self>跳转新页面</a>" B "<a href='a001.htm' target=_blank>跳转新页面</a>" 26. (单选题) 以下关于行内块元素描述错误的是( ) A 可以设置宽度和高度 B span是行内块元素 C 和相邻的行内元素以及行内块元素从左向右一次排列在同一行,直到一行排不下时才会换行。 D 可以设置4个方向的内、外边距 27. (单选题) 以下不是块级元素的标签是( ) A div B span C p D section 28. (单选题) 能够实现图片是链接的代码是() A "<a href="http://www.baidu.com"></a><img src='img/logo.png' width=30px>" B "<a href="http://www.baidu.com"><img src='img/logo.png' width=30px></a>" 29. (单选题) 在用a标签创建书签时,能够实现的代码是() A "<a id=head>我是书签</a>" B "<a href=head>我是书签</a>" 30. (单选题) 能显示如下图所示的无序列表的代码是( ) A "<ol type= "I"> <li>java </li> <li>C++ </li> <li>python </li> </ol>" B "<ol type= "i"> <li>java </li> <li>C++ </li> <li>python </li> </ol>" 二. 多选题(共5题,14.5分) 31. (多选题) 下列关于div标签的说法,哪些是正确的? A 默认不会独占一行 B 常用于网页布局 C 是一个块级元素 D 可以嵌套其他HTML元素 32. (多选题) 块级元素的特点有( )。 A 不设置宽度样式时,宽度自动撑满父元素宽度 B 不独占一行 C 独占一行 D 和相邻的块级元素依次垂直排列 E 可以设置宽度、高度、四个方向的内外边距 33. (多选题) 能够设置宽度和高度的元素级别有( )。 A 块内行元素 B 块级元素 C 行内块元素 D 行内级元素 34. (多选题) 以下是行内块元素的是( )。 A input B img C div D span 35. (多选题) 以下是块级元素的是( )。 A h1_h6 B p C span D div E ul
最新发布
09-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值