zoj 1203 Swordfish (kruskal 克鲁斯卡尔)

Swordfish


Time Limit: 2 Seconds      Memory Limit: 65536 KB


There exists a world within our world

A world beneath what we call cyberspace.

A world protected by firewalls,

passwords and the most advanced

security systems.

In this world we hide

our deepest secrets,

our most incriminating information,

and of course, a shole lot of money.

This is the world of Swordfish.

We all remember that in the movie Swordfish, Gabriel broke into the World Bank Investors Group in West Los Angeles, to rob $9.5 billion. And he needed Stanley, the best hacker in
the world, to help him break into the password protecting the bank system. Stanley‘s lovely daughter Holly was seized by Gabriel, so he had to work for him. But at the last moment, Stanley made some little trick in his hacker mission: he injected a trojan
horse in the bank system, so the money would jump from one account to another account every 60 seconds, and would continue jumping in the next 10 years. Only Stanley knew when and where to get the money. If Gabriel killed Stanley, he would never get a single
dollar. Stanley wanted Gabriel to release all these hostages and he would help him to find the money back.

You who has watched the movie know that Gabriel at last got the money by threatening to hang Ginger to death. Why not Gabriel go get the money himself? Because these money keep jumping,
and these accounts are scattered in different cities. In order to gather up these money Gabriel would need to build money transfering tunnels to connect all these cities. Surely it will be really expensive to construct such a transfering tunnel, so Gabriel
wants to find out the minimal total length of the tunnel required to connect all these cites. Now he asks you to write a computer program to find out the minimal length. Since Gabriel will get caught at the end of it anyway, so you can go ahead and write the
program without feeling guilty about helping a criminal.

Input:

The input contains several test cases. Each test case begins with a line contains only one integer N (0 <= N <=100), which indicates the number of cities you have to connect. The next
N lines each contains two real numbers X and Y(-10000 <= X,Y <= 10000), which are the citie‘s Cartesian coordinates (to make the problem simple, we can assume that we live in a flat world). The input is terminated by a case with N=0 and you must not print
any output for this case.

Output:

You need to help Gabriel calculate the minimal length of tunnel needed to connect all these cites. You can saftly assume that such a tunnel can be built directly from one city to another.
For each of the input cases, the output shall consist of two lines: the first line contains "Case #n:", where n is the case number (starting from 1); and the next line contains "The minimal distance is: d", where d is the minimal distance, rounded to 2 decimal
places. Output a blank line between two test cases.

Sample Input:

5
0 0
0 1
1 1
1 0
0.5 0.5
0

Sample Output:

Case #1:
The minimal distance is: 2.83

简单最小生成树

#include"stdio.h"
#include"string.h"
#include"math.h"
#include"algorithm"
using namespace std;
#define N 105
#define inf 0x7fffffff
int fa[N];
struct node
{
    double x,y;
}e[N];
struct st
{
    int u,v;
    double d;
}g[N*N/2];
double fun(int i,int j)
{
    double x,y;
    x=e[i].x-e[j].x;
    y=e[i].y-e[j].y;
    return sqrt(x*x+y*y);
}
bool cmp(st a,st b)
{
    return a.d<b.d;
}
int Find(int x)
{
    if(x!=fa[x])
        return fa[x]=Find(fa[x]);
}
void kruskal(int n,int k)
{
    int i,f1,f2;
    double ans=0;
    for(i=0;i<n;i++)
        fa[i]=i;
    for(i=0;i<k;i++)
    {
        f1=Find(g[i].u);
        f2=Find(g[i].v);
        if(f1!=f2)
        {
            fa[f1]=f2;
            ans+=g[i].d;
        }
    }
    printf("The minimal distance is: %.2f\n",ans);
}
int main()
{
    int i,j,k,n,cnt=0;
    double x,y;
    while(scanf("%d",&n),n)
    {
		if(cnt)
			puts("");
        for(i=k=0;i<n;i++)
        {
            scanf("%lf%lf",&x,&y);
            e[i].x=x;
            e[i].y=y;
            for(j=0;j<i;j++)   //建图、连边
            {
                g[k].u=i;
                g[k].v=j;
                g[k++].d=fun(i,j);
            }
        }
        printf("Case #%d:\n",++cnt);
        sort(g,g+k,cmp);
        kruskal(n,k);
    }
    return 0;
}

zoj 1203 Swordfish (kruskal 克鲁斯卡尔)

时间: 2024-10-11 05:09:38

zoj 1203 Swordfish (kruskal 克鲁斯卡尔)的相关文章

ZOJ 1203 Swordfish 剑鱼行动 最小生成树,Kruskal算法

题目链接:ZOJ 1203 Swordfish 剑鱼行动 Swordfish Time Limit: 2 Seconds      Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cyberspace. A world protected by firewalls, passwords and the most advanced security systems.

ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法

主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 Seconds      Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cyberspace. A world protected by firewalls, password

zoj 1203 Swordfish

链接:zoj 1203 题意:输入n个城市的坐标,输出使n个城市连通的最短路线的长度 分析:通过坐标可以将两两之间的长度即权值算出,再用最小生成树的算法 不过这个题要注意输出时的格式问题,两组数据间要空一行 #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int f[110],n,m; struct stu { int a,b; double c; }t[5000]; i

ZOJ 1203 Swordfish (经典MST ~ Kruscal)Boruvka算法

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=203 Description: We all remember that in the movie Swordfish, Gabriel broke into the World Bank Investors Group in West Los Angeles, to rob $9.5 billion. And he needed Stanley, the best ha

Kruskal克鲁斯卡尔算法

克鲁斯卡尔算法依靠两个辅助数组parent[ ] 和edges[ ]. parent[]数组用于实现并查集操作,即查询一个顶点所在集合的根节点,以及将两个集合合并成为一个集合. edges[]数组作为图中边的集合,其中各个边按照权值大小升序排序,这样克鲁斯卡尔算法只需依次遍历edges[]数组便可依次向树中 添加一个当前权值最小的边,另外借助parent[]数组的查询操作保证加入的边不会造成环. 1 #define MAXSIZE 100; 2 typedef struct{ 3 int a;

ZOJ 1203 Swordfish(最小生成树 kruskal)

题意  给你n个点的坐标  每个点都可与其它n-1个点相连  求这n个点的最小生成树的权重 裸的最小生成树  直接kruskal咯 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N = 105, M = 10050; double x[N], y[N], ans; int n, m , par[N];

zoj 1203 Swordfish 【最小生成树 prim 算法】

Swordfish Time Limit: 2 Seconds      Memory Limit: 65536 KB There exists a world within our world A world beneath what we call cyberspace. A world protected by firewalls, passwords and the most advanced security systems. In this world we hide our dee

数据结构之---C语言实现最小生成树之kruskal(克鲁斯卡尔)算法

//Kruskal(克鲁斯卡尔)算法 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAX 1000 #define MAXE MAX #define MAXV MAX typedef struct { int beginvex1; //边的起始顶点 int endvex2; //边的终止顶点 int weight; //边的权值 }Edge; void kruskal(Edge E[],int n,int e) { int

45. 蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法

本篇名言:"假如生活欺骗了你 ,不要忧郁 , 也不要愤慨 !不顺心的时候暂且容忍 : 相信吧 , 快乐的日子就会到来.--普希金" 上两篇学习了弗洛伊德和迪杰特斯拉算法.这次来看下克鲁斯卡尔算法. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47071539 1.  克鲁斯卡尔算法 克鲁斯卡尔(Kruskal)算法是在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边.是实现图的最小生成树最常用的算法.