hdu 2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树★
2014-03-31 17:43
507 查看
#include <iostream> #include <algorithm> #include <cmath> #include <string.h> using namespace std; #define MAXN 20 #define INF 1e20; int n, m; int value[MAXN]; int c[MAXN][MAXN]; int ans[MAXN]; int copys[MAXN]; bool vis[MAXN]; bool choice[MAXN]; int pre[MAXN]; struct Edge { int u, v; double w; }edge[MAXN * MAXN]; int e; void add(int u, int v, int val) { edge[e].u = u; edge[e].v = v; edge[e++].w = val; } bool cmp(Edge a, Edge b) { return a.w < b.w; } int find(int x) { return x == pre[x] ? x : (pre[x] = find(pre[x])); } double cal(int co[]) { memset(choice, false, sizeof(choice)); double temp = 0; for (int i = 0; i < m; i++) { choice[co[i]] = true; temp += value[co[i]]; } int num = 1; double res = 0; for (int i = 0; i < n; i++) { pre[i] = i; } for (int i = 0; i < e; i++) { int u = edge[i].u, v = edge[i].v, w = edge[i].w; if (choice[u] && choice[v]) { int fu = find(u), fv = find(v); if (fu != fv) { pre[fu] = fv; res += w; num++; } if (num == m) { return res / temp; } } } } double temp; void dfs(int x, int len) { if (len == m) { double r = cal(copys); if (r - temp < -(1e-12)) { temp = r; for (int i = 0; i < m; i++) { ans[i] = copys[i]; } } return ; } else { for (int i = x; i < n; i++) { if (!vis[i]) { vis[i] = true; copys[len++] = i; dfs(i, len); len--; vis[i] = false; } } } } void input() { int u, v; double val; while (cin >> n >> m) { if (!n && !m) { break; } e = 0; memset(vis, false, sizeof(vis)); for (int i = 0; i < n; i++) { cin >> value[i]; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> val; if (i < j) { add(i, j, val); } } } sort(edge, edge + e, cmp); temp = INF; dfs(0, 0); for (int i = 0; i < m; i++) { cout << ans[i] + 1; if (i != m - 1) { cout << ' '; } } cout << endl; } } int main() { input(); return 0; }
注意精度(看了别人的)。
相关文章推荐
- hdu 2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树★
- HDU 2489 Minimal Ratio Tree(枚举组合+最小生成树)
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
- hdu 2566 统计硬币 dfs 不能排除组合重复的情况 代码不完整
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
- HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)
- [HDU3699]组合情况DFS枚举
- HDU 2489 DFS枚举+最小生成树
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
- hdu 2489 Minimal Ratio Tree (DFS枚举+MST)
- 2016蓝桥杯省赛C/C++B组7题剪邮票 DFS枚举组合情况BFS判联通
- hdu 2489 (dfs枚举 + prim)
- hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~
- HDU 5642 不能出现连续四个数相同的组合情况 (组合数学)
- hdu 4403 A very hard Aoshu problem【dfs枚举】
- hdu 2489 Minimal Ratio Tree(prim+dfs)
- HDU 1298 T9 // 字典树,枚举,dfs
- hdu 1027 Ignatius and the Princess II【dfs 排列组合】
- hdu 4770 Lights Against Dudely(暴力枚举dfs)
- poj2245(枚举||组合数学||dfs)