zoj-1203(Prim算法)

MST是一个非常非常经典的问题了,ZOJ-1203则是一题MST的裸题,题目的意思就是给定n个坐标,连起n个点最短是多长。

我用的是prim算法,创建图什么的这个大家都懂。

(好久没写过题解了,不知道说些什么好~哎。)

/***********************************************************
	> OS     : Linux 3.11.10-301.fc20.x86_64 Fedora20
	> Author : yaolong
	> Mail   : [email protected]
	> Time   : 2014年07月27日 星期日 13时23分30秒
 **********************************************************/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 1<<30
class Point{
    public:
        Point(){}
        double x,y;
    double dist(Point &pt){
        return sqrt((x-pt.x)*(x-pt.x)+(y-pt.y)*(y-pt.y));
    }
};
Point v[105];
double mp[105][105];
double low[105];
bool used[105];
double prim(int n){
    double result=0;
    double min;
    int cnt=n-1;
    int pos,i;
    memset(used,0,sizeof(used));
    //原始点
    used[0]=1;
    for(i=0;i<n;i++){
        low[i]=mp[0][i];
    }

    while(cnt--){
        min=INF;
        for(i=0;i<n;i++){
            if(!used[i]&&low[i]<min){
                pos=i;
                min=low[i];
            }
        }
        result+=min;
        used[pos]=1;
        for(i=0;i<n;i++){
            if(low[i]>mp[pos][i]){
                low[i]=mp[pos][i];
            }
        }
    }
    return result;
}
int main(){
    int n,i,j;
    double x,y;
    int cas=1;
    bool flag=0;
    while(scanf("%d",&n),n){
        if(flag){
            puts("");
        }else{
            flag=1;
        }
        for(i=0;i<n;i++){
            scanf("%lf%lf",&v[i].x,&v[i].y);

        }
        for(i=0;i<n-1;i++){
            for(j=i+1;j<n;j++){
                mp[i][j]=mp[j][i]=v[i].dist(v[j]);
            }
        }
        printf("Case #%d:\n",cas);
        cas++;
        printf("The minimal distance is: %.2lf\n",prim(n));
    }

    return 0;
}

zoj-1203(Prim算法),布布扣,bubuko.com

时间: 2024-10-05 13:42:23

zoj-1203(Prim算法)的相关文章

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

zoj QS 1586 Network (prim算法)

QS Network Time Limit: 2 Seconds      Memory Limit: 65536 KB Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS. QScommunicate with ea

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

最小生成树问题(prim算法)POJ-1258 Agri-Net

/* 这个题很水,但是,莫名其妙runtime error一晚上,重写了一遍就又没了,很伤心! 题意很简单,大致为n个村庄,连光缆,要求连上所有村庄的长度最短. 输入n,接着是n*n的矩阵,直接用prim算法写就行: */ #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath>

杭电1162--Eddy&#39;s picture(Prim()算法)

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8070    Accepted Submission(s): 4084 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to b

hihocoder1097最小生成树(prim算法)

prim算法描述: prim算法的思想和代码都跟dijkstra算法非常相似. 在dijkstra算法中,我们用每次取出未标记集合中到源点最近的点进行标记并更新其邻接点到源点的距离:当d[x]+w<d[y]时更新d[y]=d[x]+w. 而在prim算法中,我们只需要对dijkstra算法稍作改动即可,即只需要改变一下更新操作:当w<d[y]时更新d[y]=w,此时d[y]的含义是节点y连接到最小生成树的边的最小取值.也就是说,从图中某个节点发出了边可能有若干条,而最终将该节点连接到最小生成树

prim算法模板

var g:array[1..10,1..10] of longint; d:array[1..10] of longint; f:array[1..10] of boolean; procedure prim; var i,j,k,min:longint; begin fillchar(g,sizeof(g),0); fillchar(f,sizeof(f),0); for i:=1 to n do d[i]:=g[1,i]; f[1]:=true; for i:=2 to n do begi

最小生成树(prim算法,Kruskal算法)c++实现

1.生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树. 生成树是连通图的极小连通子图.所谓极小是指:若在树中任意增加一条边,则将出现一个回路:若去掉一条边,将会使之变成非连通图. 生成树各边的权值总和称为生成树的权.权最小的生成树称为最小生成树. 2.最小生成树的性质用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的.按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点.n-1 条边. 3.构造最小生成树,要解决以下两个问题