图算法1之1002
2016-07-02 22:22
274 查看
1 题目编号:1002
2 题目内容:
Problem Description
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends
are not interested in his picture.Eddy feels very puzzled,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.<br>Problem descriptions as follows: Given you some coordinates pionts
on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?<br>
Input
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point. <br><br>Input contains multiple test cases. Process to the end of file.<br>
Output
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points. <br>
Sample Input
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output
3.41
3 解题思路形成过程:同上题,直接套用prim算法即可。
4 代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct Node
{
double x;
double y;
}A[110];
double G[110][110], low[110];
int vis[110];
void Prim(int N)
{
memset(vis, 0, sizeof(vis));
int pos = 1;
vis[pos] = 1;
double ans = 0;
for (int i = 1; i <= N; i++)
if (i != pos)
low[i] = G[pos][i];
for (int i = 1; i < N; i++)
{
double Min = 0x7ffffff;
for (int j = 1; j <= N; j++)
{
if (!vis[j] && Min > low[j])
{
Min = low[j];
pos = j;
}
}
vis[pos] = 1;
ans += Min;
for (int j = 1; j <= N; j++)
{
if (!vis[j] && low[j] > G[pos][j])
low[j] = G[pos][j];
}
}
printf("%.2lf\n", ans);
}
int main()
{
int N;
double Dist, x, y;
while (cin >> N)
{
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
G[i][j] = 0x7fffff;
}
memset(A, 0, sizeof(A));
for (int i = 1; i <= N; i++)
{
cin >> A[i].x >> A[i].y;
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
x = A[i].x - A[j].x;
y = A[i].y - A[j].y;
Dist = sqrt(x*x + y*y);
G[i][j] = Dist;
}
}
Prim(N);
}
return 0;
}
2 题目内容:
Problem Description
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends
are not interested in his picture.Eddy feels very puzzled,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.<br>Problem descriptions as follows: Given you some coordinates pionts
on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?<br>
Input
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point. <br><br>Input contains multiple test cases. Process to the end of file.<br>
Output
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points. <br>
Sample Input
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output
3.41
3 解题思路形成过程:同上题,直接套用prim算法即可。
4 代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct Node
{
double x;
double y;
}A[110];
double G[110][110], low[110];
int vis[110];
void Prim(int N)
{
memset(vis, 0, sizeof(vis));
int pos = 1;
vis[pos] = 1;
double ans = 0;
for (int i = 1; i <= N; i++)
if (i != pos)
low[i] = G[pos][i];
for (int i = 1; i < N; i++)
{
double Min = 0x7ffffff;
for (int j = 1; j <= N; j++)
{
if (!vis[j] && Min > low[j])
{
Min = low[j];
pos = j;
}
}
vis[pos] = 1;
ans += Min;
for (int j = 1; j <= N; j++)
{
if (!vis[j] && low[j] > G[pos][j])
low[j] = G[pos][j];
}
}
printf("%.2lf\n", ans);
}
int main()
{
int N;
double Dist, x, y;
while (cin >> N)
{
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
G[i][j] = 0x7fffff;
}
memset(A, 0, sizeof(A));
for (int i = 1; i <= N; i++)
{
cin >> A[i].x >> A[i].y;
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
x = A[i].x - A[j].x;
y = A[i].y - A[j].y;
Dist = sqrt(x*x + y*y);
G[i][j] = Dist;
}
}
Prim(N);
}
return 0;
}
相关文章推荐
- 渗透技术一瞥(图)
- 图片引发的溢出危机(图)
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- jQuery圆形统计图开发实例
- 手机短信轰炸(图)
- C语言实现图的遍历之深度优先搜索实例
- python数据结构之图的实现方法
- ASP.Net页面生成饼图实例
- 基于Java实现的图的广度优先遍历算法
- ps制作个性的特定形状图
- RelativeLayout浅谈
- 图
- Ext Scheduler Web资源甘特图控件
- 键盘码 图
- 图(1)——图的定义和基本概念
- 图(2)—— 邻接矩阵表示法
- 图(2)—— 邻接矩阵表示法
- 图(3)——邻接链表法
- 图(3)——邻接链表法