HDU 3586 Information Disturbing 树形DP
来源:互联网 发布:颜色代码源码 编辑:程序博客网 时间:2024/05/19 05:03
代码1:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 1003#define inf 1<<29struct node{ int v, next, w;}edge[maxn<<1];int n, m;int head[maxn];int tot;void init(){ tot = 0; memset(head, -1, sizeof(head));}void add(int x, int y, int w){ edge[tot].v = y; edge[tot].w = w; edge[tot].next = head[x]; head[x] = tot++;}int minz(int a, int b){ return a < b ? a : b;}int dp[1003];void dfs(int u, int pre, int sum){ int i; bool flag = 0; int tmp = 0; for(i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if(v == pre) continue; dfs(v, u, sum); flag = 1; if(w <= sum) tmp += minz(dp[v], w); else { if(dp[v] < inf) tmp += dp[v]; else flag = 0; } if(!flag) break; } if(flag) dp[u] = minz(dp[u], tmp);}int main(){ int i, j; int x, y, w; while( ~scanf("%d%d", &n, &m) && (n||m) ) { init(); for(i = 0; i < n-1; i++) { scanf("%d%d%d", &x, &y, &w); add(x, y, w); add(y, x, w); } int l = 0, r = m; while(l <= r) { int mid = (l + r) >> 1; for(i = 1; i <= n; i++) dp[i] = inf; dfs(1, 1, mid); if(dp[1] > m) l = mid + 1; else r = mid - 1; //printf("l = %d r = %d\n", l, r); } if(l > m) puts("-1"); else printf("%d\n", l); } return 0;}
代码2:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 1003#define inf 1000001 //注意别太大,不然会超intstruct node{ int v, next, w;}edge[maxn<<1];int head[maxn];int tot;int n, m;void init(){ tot = 0; memset(head, -1, sizeof(head));}void add(int x, int y, int w){ edge[tot].v = y; edge[tot].w = w; edge[tot].next = head[x]; head[x] = tot++;}int minz(int a, int b){ return a < b ? a : b;}int dp[1003];void dfs(int u, int pre, int sum){ int i; bool flag = 0; int tmp = 0; for(i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if(v == pre) continue; //printf("v = %d w = %d\n", v, w); dfs(v, u, sum); if(w <= sum) tmp += minz(dp[v], w); else tmp += dp[v]; flag = 1; } if(flag) dp[u] = minz(dp[u], tmp);}int main(){ int i, j; int x, y, w; while( ~scanf("%d%d", &n, &m) && (n||m) ) { init(); for(i = 0; i < n-1; i++) { scanf("%d%d%d", &x, &y, &w); add(x, y, w); add(y, x, w); } int l = 0, r = m; while(l <= r) { int mid = (l + r) >> 1; for(i = 1; i <= n; i++) dp[i] = inf; dfs(1, 1, mid); if(dp[1] > m) l = mid + 1; else r = mid - 1; //printf("l = %d r = %d\n", l, r); } if(l > m) puts("-1"); else printf("%d\n", l); } return 0;}
- HDU 3586 Information Disturbing 树形DP
- (简单) 树形dp HDU 3586 Information Disturbing
- hdu 3586 Information Disturbing 树形dp+二分
- HDU 3586 Information Disturbing(树形DP)
- hdu 3586 Information Disturbing(树形dp)
- HDU 3586 Information Disturbing 二分+树形DP
- HDU 3586 Information Disturbing (树形DP+二分)
- hdu 3586 Information Disturbing 删边类树形DP
- HDU 3586 Information Disturbing(树形DP)
- hdu 3586 Information Disturbing(树形dp)
- HDU 3586 Information Disturbing 树形DP+二分
- hdu 3586 Information Disturbing 树形dp+二分
- hdu 3586 Information Disturbing(树形dp)
- HDU 3586 Information Disturbing(树形DP + 二分)
- HDU 3586 Information Disturbing (枚举+树形DP)
- 【HDU】3586 Information Disturbing 二分+树形dp
- hdu 3586 Information Disturbing(树形dp + 二分)
- hdu 3586 Information Disturbing(树形DP+二分查找+删变暖)
- POJ 1755 Triathlon 半平面交
- ORACLE Checkpoint-检查点队列与增量检查点
- POJ 2540 Hotter Colder 半平面交 求可行域面积
- HDU 3699 A hard Aoshu Problem 2010 Asia Fuzhou Regional Contest J题 模拟 + 搜索
- HUD 3697 Selecting courses 2010 Asia Fuzhou Regional Contest E题 贪心
- HDU 3586 Information Disturbing 树形DP
- POJ 1655 Balancing Act 树形DP入门题
- POJ 2823 Sliding Window 双端队列入门题
- MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写
- Android1.6及以下读取联系人方法
- POJ 4001 -- 4003 2011福州 A,B,C题
- 自动登录的实现
- HDU 2196 Computer 树形DP(2个dfs)
- POJ 4026 Eve 并查集模拟题