[BZOJ 2180]最小直径生成树
2016-02-19 21:33
405 查看
最小直径生成树
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define maxn 210 using namespace std; const int inf = 0x7fffffff / 2; int n, m; int f[maxn][maxn], d[maxn][maxn], p[maxn][maxn]; void MST(){ //Floyd for(int k = 1; k <= n; k ++) for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) if(i != j && j != k && k != i) f[i][j] = min(f[i][j], f[i][k] + f[k][j]); //getrank for(int i = 1; i <= n; i ++){ for(int j = 1; j <= n; j ++) p[i][j] = j; for(int j = 1; j <= n; j ++) for(int k = j + 1; k <= n; k ++) if(f[i][p[i][j]] > f[i][p[i][k]]) swap(p[i][j], p[i][k]); } //main int ans = inf; for(int u = 1; u <= n; u ++){ for(int v = 1; v <= n; v ++){ if(d[u][v] != inf){ ans = min(ans, min(f[u][p[u] ] << 1, f[v][p[v] ] << 1)); int t = n; for(int k = n - 1; k >= 1; k --){ if(f[v][p[u][t]] < f[v][p[u][k]]){ ans = min(ans, f[u][p[u][k]] + f[v][p[u][t]] + d[u][v]); t = k; } } } } } printf("%d\n", ans); } int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) f[i][j] = d[i][j] = inf; for(int i = 1; i <= n; i ++) f[i][i] = d[i][i] = 0; int u, v, dis; for(int i = 1; i <= m; i ++){ scanf("%d%d%d", &u, &v, &dis); f[u][v] = f[v][u] = d[u][v] = d[v][u] = dis; } MST(); return 0; }
相关文章推荐
- json
- ThinkPHP框架总结之安全及使用
- 四维超体运动在三维空间的表现1(使用three.js)
- 算法竞赛入门经典 孪生素数
- [oj]樱花对称问题
- 【opencv】图像平滑处理
- zabbix企业应用:监控Dell Compellent存储设备
- C++之 构造函数调用规则
- JavaScript 的性能优化:加载和执行
- 笔记:Deep multi patch aggregation network for image style, aesthetics and quality estimation
- 松哥推荐的nginx配置教程
- VBA单元格拷贝
- Android线程一、AsyncTask使用简介
- bzoj1208[HDOI2004] 宠物收养所
- JQuery 常用积累(六)ZTree
- [NOIP 2010] 引水入城
- Chapter 3、Java语法基础(一)---- Java程序基本结构 (19th,Feb)
- 关于css的一些小细节---link
- 3261: 最大异或和 可持久化trie
- 递归,搜索,回溯,最优路径(线段)