您的位置:首页 > 其它

Uva 216 - Getting in Line

2013-04-23 17:15 363 查看
Getting in Line
题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=152
题目比较典型,给你n个点的坐标,找出一条连接所有点的最短的路径,并且求出此时每两个点之间的路径长度,是跟前天校赛最后一题的题目类似,当时听题解时说是二分图匹配,我想这题也可以用二分图匹配吧?但还是用了当初的做法,可以用深度查找(回溯),或者用上排列,我纳闷为什么一开始我会认为是最小生成树呢?汗!!根本是不沾边的事情啊,尽管知道怎么做,但还是调试了一段时间啊

排列做法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<algorithm>
#define MAXN 10
#define MAX_VALUE 21474836
using namespace std;
typedef struct dot{
int x, y;
}dot;
dot maze[MAXN];
double len[MAXN] , last_len[MAXN];
int list[MAXN], last_list[MAXN];
double cal_dis(int i, int j)
{
return sqrt((double)((maze[i].x-maze[j].x)*(maze[i].x-maze[j].x)+(maze[i].y-maze[j].y)*(maze[i].y-maze[j].y)));
}
int main()
{

int T=0;
int n;
while(cin>>n && n)
{
for(int i=0; i<n; ++i)
cin>>maze[i].x>>maze[i].y;
for(int i=0; i<n; ++i) list[i] = i;
double max = MAX_VALUE;
do
{
double ans = 0;
len[0] = 0;
for(int i=1; i<n; ++i)
{
len[i] = cal_dis(list[i-1], list[i])+16;

ans += len[i];
}
if(max > ans)
{
max = ans;
memcpy(last_list, list, sizeof(int)*n);
for(int i=1; i<n; ++i) last_len[i] = len[i];
}
}while(next_permutation(list, list+n));
printf("**********************************************************\nNetwork #%d\n", ++T);
for(int i=1; i<n; ++i)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
maze[last_list[i-1]].x, maze[last_list[i-1]].y, maze[last_list[i]].x, maze[last_list[i]].y, last_len[i]);
}
printf("Number of feet of cable required is %.2lf.\n", max);
}
return 0;
}


深度查找(回溯):

#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXN 10
double maze[MAXN][MAXN], road[MAXN];
int x[MAXN], y[MAXN];
int visit[MAXN];
int record[MAXN], reco[MAXN];
double final[MAXN];
double max;
double calcu_dis(int x1, int y1, int x2, int y2)
{
int temp = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
return sqrt((double)temp);
}

void dfs(int n, int last, int cur)
{
int i, j;
double sum = 0;
if(cur == n)
{
for(j=0; j<n; ++j)
{
sum += road[j];
}
if(sum < max)
{
max = sum;
for(j=0; j<n; ++j)
final[j] = road[j], reco[j] = record[j];
}
return;
}
for(i=0; i<n; ++i)
{
if(!visit[i])
{
visit[i] = 1;
record[cur] = i;
road[cur] = calcu_dis(x[last], y[last], x[i], y[i]);
dfs(n, i, cur+1);
visit[i] = 0;
}
}
return;
}

int main()
{

int i, j, n, T=1;
while(scanf("%d", &n) != EOF && n)
{
max = 21474836;
for(i=0; i<n; ++i)
scanf("%d%d", &x[i], &y[i]);
memset(visit, 0, sizeof(visit));
for(i=0; i<n; ++i)
{
visit[i] = 1;
record[0] = i;
road[0] = 0;
dfs(n, i, 1);
visit[i] = 0;
}

printf("**********************************************************\nNetwork #%d\n", T++);
for(i=1; i<n; ++i)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
x[reco[i-1]], y[reco[i-1]], x[reco[i]], y[reco[i]], final[i]+16);
}
printf("Number of feet of cable required is %.2lf.\n", max+(n-1)*16);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: