您的位置:首页 > 其它

最小生成树Prim模板

2012-02-23 09:13 435 查看
Prim适用于稠密图,对于给定坐标求最小生成树的题目再合适不过。

e.g.

畅通工程再续
http://acm.hdu.edu.cn/showproblem.php?pid=1875

Freckles
http://poj.org/problem?id=2560

这里贴出Hdu 1875 的代码

#include "iostream"
#include "stdio.h"
#include "math.h"
#include "map"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
#define N 105
#define INF 1<<30

struct NODE
{
	double x,y;
};

NODE island
;
bool visited
;
double dis

;
int S_set
;

double DIS(NODE a,NODE b)
{
    double x= sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
    if(x<10||x>1000)
        return INF;
    return x;
}

int main()
{
    int cas,i,j,n,k;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%lf%lf",&island[i].x,&island[i].y);
        memset(dis,-1,sizeof(dis));
        for(i=1;i<=n;i++)
            for(j=1;j<i;j++)
                dis[i][j]=dis[j][i]=DIS(island[i],island[j]);
        memset(visited,false,sizeof(visited));
        visited[1]=true;
        S_set[1]=1;
        double ans=0;
        bool flag=true;
        for(i=2;i<=n;i++)        //n-1 roads
        {
            double minn=INF;
            int point;
            //find the shortest path
            for(j=1;j<i;j++)//have i points in S_set currently
            {
                int cur_p=S_set[j];
                for(k=1;k<=n;k++)
                {
                    if(cur_p!=k&&minn>dis[cur_p][k]&&dis[cur_p][k]>0&&!visited[k])
                    {
                        minn=dis[cur_p][k];
                        point=k;
                    }
                }
            }
            if(minn==INF)
            {
                flag=false;
                break;
            }
            ans+=minn;
            S_set[i]=point;
            visited[S_set[i]]=true;
        }
        if(!flag){
            cout<<"oh!"<<endl;
            continue;}
        printf("%.1lf\n",ans*100);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: