HDU 4463 Outlets(一条边固定的最小生成树)

Outlets

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2594    Accepted Submission(s): 1196

Problem Description

In China, foreign brand commodities are often much more expensive than abroad. The main reason is that we Chinese people tend to think foreign things are better and we are willing to pay much for them. The typical example is, on the United Airline flight, they give you Haagendazs ice cream for free, but in China, you will pay $10 to buy just a little cup.
So when we Chinese go abroad, one of our most favorite activities is shopping in outlets. Some people buy tens of famous brand shoes and bags one time. In Las Vegas, the existing outlets can‘t match the demand of Chinese. So they want to build a new outlets in the desert. The new outlets consists of many stores. All stores are connected by roads. They want to minimize the total road length. The owner of the outlets just hired a data mining expert, and the expert told him that Nike store and Apple store must be directly connected by a road. Now please help him figure out how to minimize the total road length under this condition. A store can be considered as a point and a road is a line segment connecting two stores.

Input

There are several test cases. For each test case: The first line is an integer N( 3 <= N <= 50) , meaning there are N stores in the outlets. These N stores are numbered from 1 to N. The second line contains two integers p and q, indicating that the No. p store is a Nike store and the No. q store is an Apple store. Then N lines follow. The i-th line describes the position of the i-th store. The store position is represented by two integers x,y( -100<= x,y <= 100) , meaning that the coordinate of the store is (x,y). These N stores are all located at different place. The input ends by N = 0.

Output

For each test case, print the minimum total road length. The result should be rounded to 2 digits after decimal point.

Sample Input

4
2 3
0 0
1 0
0 -1
1 -1
0

Sample Output

3.41

题目大意:

  这道题是说,给你n个点,然后要求p和q号城市之间必须有道路相连接,然后,其他的道路之间满足最小生成树。说白了,就是一个 一条边固定的最小生成树问题。

解题思路:

  直接用并查集搞就行了,没有什么难度。。。

代码:

  

# include<cstdio>
# include<iostream>
# include<cmath>
# include<cstring>
# include<algorithm>

using namespace std;

# define MAX 54*54

struct node
{
    int x,y;
}point[MAX];
int f[MAX];

void init()
{
    for ( int i = 0;i < MAX;i++ )
    {
        f[i] = i;
    }
}

struct edge
{
    int u,v;
    double cost;
}e[MAX];

int cmp( const struct edge & a,const struct edge & b )
{
    return a.cost < b.cost;
}

double dis ( node a,node b )
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
}

int getf( int x )
{
    if ( f[x]==x )
        return x;
    else
    {
        int t = getf(f[x]);
        f[x] = t;
        return f[x];
    }
}

int main(void)
{
    int n;
    while ( scanf("%d",&n)!=EOF )
    {
        if ( n==0 )
            break;
        init();
        int p,q; scanf("%d%d",&p,&q);
        for ( int i = 1;i <= n;i++ )
        {
            scanf("%d%d",&point[i].x,&point[i].y);
        }
        int cnt = 0;
        for ( int i = 1;i <= n-1;i++ )
        {
            for ( int j = i+1;j <= n;j++ )
            {
                if( i==p&&j==q||i==q&&j==p )
                {
                    e[cnt].cost = 0;
                }
                else
                {
                    e[cnt].cost = dis(point[i],point[j]);
                }
                e[cnt].u = i; e[cnt].v = j;
                cnt++;
            }
        }
        int num = 0;
        double ans = 0;
        sort(e,e+cnt,cmp);
        ans = dis(point[p],point[q]);
        for ( int i = 0;i < cnt;i++ )
        {
            int x = getf(e[i].u);
            int y = getf(e[i].v);
            if ( x!=y )
            {
                num++;
                f[x] = y;
                ans+=e[i].cost;
                if(num==n-1)
                    break;
            }
        }
        printf("%.2lf\n",ans);
        memset(e,0,sizeof(e));
    }

    return 0;
}

  

时间: 2025-01-06 20:04:05

HDU 4463 Outlets(一条边固定的最小生成树)的相关文章

HDU 4463: Outlets

http://acm.hdu.edu.cn/showproblem.php?pid=4463 1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 #include <iomanip> 5 //n:= # of vertices 6 using namespace std; 7 const int MAXN = 55; 8 typedef pair<int, int>

hdu 4463 Outlets(最小生成树)

题意:n个点修路,要求总长度最小,但是有两个点p.q必须相连 思路:完全图,prim算法的效率取决于节点数,适用于稠密图.用prim求解. p.q间距离设为0即可,最后输出时加上p.q间的距离 prim算法: #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; #define INF 15000//计算得最长值 #defin

hdu 4463 Outlets Prim 次小生成树 简单题

Outlets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2200    Accepted Submission(s): 1028 Problem Description In China, foreign brand commodities are often much more expensive than abroad. T

HDU 4463 Outlets (prime_杭州区域赛水题)

Problem Description In China, foreign brand commodities are often much more expensive than abroad. The main reason is that we Chinese people tend to think foreign things are better and we are willing to pay much for them. The typical example is, on t

HDU 4463 Outlets 【最小生成树】

<题目链接> 题目大意: 给你一些点的坐标,要求你将这些点全部连起来,但是必须要包含某一条特殊的边,问你连起这些点的总最短距离是多少. 解题分析: 因为一定要包含那条边,我们就记录下那条边的边权,然后将那条边边权置为0,再跑一遍最小生成树即可. #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int n,

【HDU 4463 Outlets】最小生成树

以(x,y)坐标的形式给出n个点,修建若干条路使得所有点连通(其中有两个给出的特殊点必须相邻),求所有路的总长度的最小值. 因对所修的路的形状没有限制,所以可看成带权无向完全图,边权值为两点间距离.因是稠密图,故用邻接矩阵存储更好(完全图,边数e达到n(n-1)/2). 至此,可将问题抽象为求最小生成树的边权和. 邻接矩阵版Prim算法求最小生成树,时间复杂度为O(n*n).邻接表版prim用堆优化后理论上可达O(elogn),边数组版kruscal理论也为O(elogn),但此题是完全图,e=

hdu 4463 Outlets 最小生成树

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

hdu 4463 有一条边必须加上 (2012杭州区域赛K题)

耐克店 和 苹果店必须相连 Sample Input42 30 01 00 -1 1 -10 Sample Output3.41 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long long 7 using namespace std ; 8

hdu 4463 第37届ACM/ICPC杭州赛区K题 最小生成树

题意:给坐标系上的一些点,其中有两个点已经连了一条边,求最小生成树的值 将已连接的两点权值置为0,这样一定能加入最小生成树里 最后的结果加上这两点的距离即为所求 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map>