UVA 216 Getting in Line
深搜回溯,找出最短的路径。。搜索过程中保存下路径。最后输出。。
其实也可以用全排列的next_permutation 暴力找出最短。。
#include <stdio.h>
#include <string.h>
#include <math.h>
int n;
double x[10], y[10];
int vis[10];
int lu[10];
int minlu[10];
int tt;
double dd;
void dfs(int num, double sum, int nn)
{
if (num == n)
{
if (dd > sum)
{
dd = sum;
for (int i = 0; i < n; i ++)
{
minlu[i] = lu[i];
}
}
return;
}
for (int i = 0; i < n; i ++)
{
if (vis[i] == 0)
{
double d = sqrt((x[i] - x[nn]) * (x[i] - x[nn]) + (y[i] - y[nn]) * (y[i] - y[nn])) + 16;
vis[i] = 1;
lu[num] = i;
dfs(num + 1, sum + d, i);
lu[num] = -1;
vis[i] = 0;
}
}
}
int main()
{
int tt = 1;
while (scanf("%d", &n) != EOF && n)
{
dd = 1000000000;
memset(vis, 0 ,sizeof(vis));
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(lu, -1, sizeof(lu));
memset(minlu, 0, sizeof(minlu));
for (int i = 0; i < n ; i ++)
{
scanf("%lf%lf", &x[i], &y[i]);
}
for (int i = 0; i < n; i ++)
{
lu[0] = i;
vis[i] = 1;
dfs(1, 0, i);
vis[i] = 0;
lu[0] = -1;
}
printf("**********************************************************\n");
printf("Network #%d\n", tt ++);
for (int i = 0; i < n - 1 ; i++)
{
double ddd;
ddd = sqrt((x[minlu[i]] - x[minlu[i + 1]]) * (x[minlu[i]] - x[minlu[i + 1]]) + (y[minlu[i]] - y[minlu[i + 1]]) * (y[minlu[i]] - y[minlu[i + 1]]));
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n", int(x[minlu[i]] + 0.5),int(y[minlu[i]] + 0.5),int(x[minlu[i + 1]] + 0.5),int (y[minlu[i + 1]] + 0.5), ddd + 16);
}
printf("Number of feet of cable required is %.2lf.\n", dd);
}
return 0;
}