THU-2016-3-1-TSP
2016-12-17 11:12
141 查看
ACM模版
描述
题解
树归问题,名字虽然叫TSP,却和TSP没有啥关系,一道典型的树归问题。当然,方法不止一种,还可以先用拓扑排序预处理一下。代码
#include <cstdio> #define MAX_N 100005 #define MAX_M 1000005 #define max(a, b) ((a > b) ? (a) : (b)) using namespace std; const int INF = 0x3f3f3f3f; struct edge { int to, w, next; edge() { w = to = next = 0; } }; edge D[MAX_M]; // 邻接表 int head[MAX_N];// 邻接表头 int dp[MAX_M]; // dp[i]:第i条边为开始的最长路 int num[MAX_N]; // num[i]:以i为起点的最长路 int cnt = 1; // 往邻接表中添加边 void add(int u, int v, int w) { D[cnt].to = v; D[cnt].w = w; D[cnt].next = head[u]; head[u] = cnt++; } // 树归部分 int DFS(int s) { int maxn = 0; for (int i = head[s]; i; i = D[i].next) { if (dp[i] == -1) { dp[i] = DFS(D[i].to) + D[i].w; } maxn = max(maxn, dp[i]); } return maxn; } // 从起点开始查找最长路 void find(int s, int w) { printf("%d\t", s); int minx = INF, W = 0; for (int i = head[s]; i; i = D[i].next) { // 保证在最长路上并且字典序最小 if (dp[i] == w && minx > D[i].to) { W = w - D[i].w; minx = D[i].to; } } if (minx != INF) { find(minx, W); } return ; } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 0; i <= m; i++) { dp[i] = -1; } int a, b, p; for (int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &p); add(a, b, p); } int maxn = -1, temp = 0; for (int i = 1; i <= n; i++) { num[i] = DFS(i); if (num[i] > maxn) { maxn = num[i]; temp = i; } } find(temp, maxn); printf("\n"); return 0; }
相关文章推荐
- JSTSP2016 Fully Deep Blind Image Quality Predictor
- bzoj1355——2016——3——15
- 我的2016
- Python基于回溯法子集树模板解决旅行商问题(TSP)实例
- 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
- 2016总结
- HDU 5988 2016青岛区域赛 (最小费用流)
- Exchange Server 2016 独立部署/共存部署 (六)—— 创建数据库副本
- 2016安卓手机安全隐私之对比与分析
- 2016,再见 2017,还请多多指教
- 遗传算法(三)解TSP问题
- 网易游戏2016研发实习生招聘在线编程题目 推箱子
- JZOJ 4710 Value【NOIP2016提高A组模拟8.17】
- 2016 - 12 月 27 SPOJ Interesting Subset
- 遗传算法(四)MATLAB GA工具箱使用 附解TSP问题
- cf#8VC Venture Cup 2016 - Final Round (Div. 2 Edition)-B. sland Puzzle 水题/hash
- 我的2016个人总结