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; }
相关文章推荐
- UVA216 Getting in Line
- uva216 Getting in Line
- uva 216 Getting in Line
- uva 216 - Getting in Line
- UVa 216 Getting in Line
- UVA 216 Getting in Line
- UVA - 216 Getting in Line (全排列枚举 和 回溯两种解法)
- UVA216-Getting in Line
- Getting in Line UVA 216
- UVA 216 Getting in Line
- UVA 216 Getting in Line
- uva216-Getting in Line(网络连线)
- UVa 216 - Getting in Line(回溯法)
- uva216 Getting in Line
- UVa 216 Getting in Line
- UVA 216 Getting in Line
- UVA 216(Getting in Line)回溯
- UVa 216 - Getting in Line
- UVa 216 - Getting in Line
- uva 216 Getting in Line