您的位置:首页 > 其它

LA 5713  Qin&nbsp…

2013-12-14 20:03 351 查看
这是一个要建图和枚举的题目 ,

想到枚举 , 我们这个题目只能枚举人口 A, 和 最后所得的最短路B , 进一步想 , 最短路B要枚举是不可能的 ,
所以只能枚举人口A , 也就是枚举每一条边(假设这条边的边权为0) 。

想到这里题目就基本上做出来了,有几个注意点:

1、求最短路时用kruskal算法 , 不然会超时 , (一般情况下都是kruskal这个算法更快 ,
因为它可以通过优先队列来进行优化)。

2、两个城市之间的距离是指它们的最小距离 , 也就是两个城市相连的那条直线。

代码:

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct node

{

    int from ,
to ;

    double
dist;

    node(int
from , int to , double dist)

    {

   
   
this->from = from;

   
    this->to
= to;

   
   
this->dist = dist;

    }

    bool
operator <(const struct node &ans) const

    {

   
    return dist
> ans.dist;

    }

};

const int MAXN = 1100 ;

int city[MAXN][3] ;

int n , done[MAXN] , p[MAXN] , f[MAXN];

double maxbian[MAXN][MAXN] , sum = 0 ;

priority_queueedge;

void init()

{

    int i;

    scanf("%d",
&n);

   
memset(maxbian , 0 , sizeof(maxbian));

    for(i = 1; i
<= n; i++)

    {

       
scanf("%d %d %d", &city[i][0], &city[i][1],
&city[i][2]);

   
    f[i] =
i;

    }

    for(i = 1; i
<= n; i++)

       
for(int j = i+1; j <= n; j++)

       
{

           
double xx = city[i][0] - city[j][0];

           
double yy = city[i][1] - city[j][1];

   
   
    double zz =
sqrt(xx*xx+yy*yy);

   
   
   
maxbian[i][j] = maxbian[j][i] = zz;

           
edge.push(node(i , j , zz));

   
   
//   
cout<<maxbian[i][j]<<endl;

       
}

    sum =
0;

}

int find(int x)

{

    int y =
x;

    while(x !=
f[x])

   
    x =
f[x];

    while(y !=
x)

    {

   
    int xy =
f[y];

   
    f[y] =
x;

   
    y =xy;

    }

    return
x;

}

void mintree()

{

    int bz =0
;

   
vectorq[MAXN];

   
while(!edge.empty())

    {

   
    struct node
s = edge.top();

   
   
edge.pop();

   
    int x =
find(s.from) , y = find(s.to);

   
    if(x !=
y)

   
    {

   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: