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)
{
想到枚举 , 我们这个题目只能枚举人口 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)
{
相关文章推荐
- uva 11354 Bond
- 最小生成树的一些性质和理解
- poj 2485 简单的最小生…
- 我的博客今天0岁42天了,我领取了…
- LA 4080 Warfare A…
- hdu 2433 最短路树
- 【快速】排序, T(n) = O(nlgn),O(n^2) S(n) = O(lgn) --- 不稳定
- (C# 基础) 类访问修饰符
- LA 3713 Astronauts
- LA 3211 Now or later
- uva 11324
- LA 5135 Mining Your Own Business
- http://kb.cnblogs.com/page/130970/ -http协议
- poj 2942 LA3523 点-双…
- uva 10047
- STL中优先队列的用法
- 并查集及其路径的压缩
- 求欧拉回路的路径 dfs的一种新运用
- poj 2676
- poj 2531