poj_2485_mst
Description
Flatopian towns are numbered from 1 to N and town i has a position given by the Cartesian coordinates (xi, yi). Each highway connects exaclty two towns. All highways (both the original ones and the ones that are to be built) follow straight lines, and thus their length is equal to Cartesian distance between towns. All highways can be used in both directions. Highways can freely cross each other, but a driver can only switch between highways at a town that is located at the end of both highways.
The Flatopian government wants to minimize the cost of building new highways. However, they want to guarantee that every town is highway-reachable from every other town. Since Flatopia is so flat, the cost of a highway is always proportional to its length. Thus, the least expensive highway system will be the one that minimizes the total highways length.
Input
The first line of the input file contains a single integer N (1 <= N <= 750), representing the number of towns. The next N lines each contain two integers, xi and yi separated by a space. These values give the coordinates of i th town (for i from 1 to N). Coordinates will have an absolute value no greater than 10000. Every town has a unique location.
The next line contains a single integer M (0 <= M <= 1000), representing the number of existing highways. The next M lines each contain a pair of integers separated by a space. These two integers give a pair of town numbers which are already connected by a highway. Each pair of towns is connected by at most one highway.
Output
If no new highways need to be built (all towns are already connected), then the output file should be created but it should be empty.
Sample Input
9
1 5
0 0
3 2
4 5
5 1
0 4
5 2
1 2
5 3
3
1 3
9 7
1 2
Sample Output
1 6
3 7
4 9
5 7
8 3 这道题就是给出了n个村的坐标,然后给出了m条路,表示已经修好的路,不过要求的不是求最小权值,而是问,修建哪些路最优,输出需要修的路。
既然这道题要求的是输出需要修建的路,只需要在把一个点从v拿出加到u里的同时,记录下这条边就OK了,所以,可以再维护一个数组,pre[MAXN],
因为cost[i][j]表示i和j之间的权值为cost[i][j],所以连接j的时候更新pre[j],即:
pre[i]表示j这个点的前导节点,在扫描u,v之间的最小边的同时更新pre[i].
这道题不是直接给出了点,而是给出了点的坐标,其实只需要定义一个Point,用来存储点的坐标,point[i]的坐标为point[i].x和point[i].y
另外,输出的顺序可以不一样,我开始就是因为顺序不一样不敢交。
#include<cstdio>
#include<cstring>
#include<cmath>
const double INF=999999999.9;//注意这里是double,我开始逗比写成了int
const int MAXN=755;
struct Point
{
double x,y;
}point[MAXN];
double cost[MAXN][MAXN];
bool vis[MAXN];
double lowc[MAXN];
int pre[MAXN];
int tot;//记得初始化
double get_dis(int i,int j)
{
return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
//这里其实可以不开方
}
int prim(int n)
{
memset(vis,false,sizeof(vis));
memset(pre,0,sizeof(pre));//初始化
vis[1]=true;
double ans=0.0;//double double double
for(int i=2;i<=n;i++)
{
lowc[i]=cost[1][i];
pre[i]=1;//点i的前导节点是1
}
for(int i=2;i<=n;i++)
{
double minc=INF;
int p=-1;
for(int j=1;j<=n;j++)
if(!vis[j]&&lowc[j]<minc)
{
minc=lowc[j];
p=j;
}
if(minc==INF)
return -1;
ans+=minc;
vis[p]=true;
if(cost[p][pre[p]]!=0||cost[pre[p]][p]!=0)
{
printf("%d %d\n",pre[p],p);//注意空格
}
for(int j=1;j<=n;j++)
if(!vis[j]&&cost[p][j]<lowc[j])
{
lowc[j]=cost[p][j];
pre[j]=p;//更新
}
}
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);//double型输入用lf,因为这个也逗比了很久
}
for(int i=1;i<=n;i++)
{
lowc[i]=INF;//初始化
for(int j=1;j<=n;j++)
{
cost[i][j]=get_dis(i,j);
}
}
int m;
int u,v;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
cost[u][v]=cost[v][u]=0;
}
double ans=prim(n);
if(ans==0.0)
printf("\n");
}
return 0;
}
poj_2485_mst的更多相关文章
随机推荐
- 为mysql在表的某一位置增加一列
如果想在一个已经建好的表中添加一列,可以用诸如: alter table t1 add column addr varchar(20) not null; 这条语句会向已有的表t1中加入一列addr, ...
- 打开eclipse报错:发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素。
[错误] 打开eclipse报错:发现了以元素 ‘d:skin’ 开头的无效内容.此处不应含有子元素. [具体报错信息] Error parsing D:\Android-sdks\system-im ...
- CentOS6.4-RMAN定时任务备份 on 11GR2
1.rman备份脚本位置: /home/oracle ./scripts/ ./bin -----存放rman脚本 ./log ...
- unity3D游戏开发之详解Animation类和Animator类
详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...
- 运行Appium碰到的坑们
运行Appium的时候,碰到的那些坑 1. java命令会出现error:could not open ...jvm.cfg 出现这种情况大多是因为电脑上之前安装过JDK,卸载重装之后,运行java命 ...
- 使用ExpandableListView——当有Group选项展开时,如何正确获取长按的Group选项。
当我们使用ExpandableListView时,实现点击一个GroupView则展开ChidView,那么这个时候,Adapter的大小前后是有变化的. 例如:假设有20个GroupView,每个G ...
- ubuntu 安装 boost
1.tar -zxvf boost_1_43_0.tar.gz 2.cd boost_1_43_0, 执行: sudo ./bootstrap.sh sudo ./bjam install 检验安装 ...
- ExtJs学习笔记之FormPanel组件
FormPanel组件 FormPanel 为 form 表单提供了一个标准的容器. 本质上还是一个标准的 Ext.panel.Panel, 只是自动创建了一个 BasicForm 来管理所有添加到 ...
- Oracle 支持正则表达式的函数
内容提要 oracle 10g 增加的正则表达式函数有以下四种: regexp_like() --返回满足条件的字段 regexp_instr() --返回满足条件的字符或字符串的位置 regexp_ ...
- [Hibernate] - one to one
两种不同方式的一对一映射关系: 1)配置文件: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8" ...