UVA - 10859 Placing Lampposts 暴力+森林+技巧
来源:互联网 发布:javascript自学教程 编辑:程序博客网 时间:2024/05/29 16:25
题目大意:给出一个n个点m条边的无向环路,在尽量少的节点上放置灯笼,使得所有的边都被照亮,每盏灯将照亮以它为一个端点的所有边,在灯的总数最小的前提下,被两盏灯同时照亮的边数应该最大
解题思路:n个点m条边的无向环路可以看成是一个森林。枚举每个节点,这里有两种情况:
1.该节点点亮:该节点点亮的话,就表示该节点和其子节点的灯可以不必点亮
2.该节点不点亮:只有当该节点的父节点点亮或者该节点是根节点时才允许
这里假设照亮的灯的数量为a,被一盏灯照亮的边数为c,一个很大的数为M(M是一个比c的最大理论值和c的最小理论值之差还要大的数),这样的话,设Y = aM + c,因为M的性质,所以a = Y / M, c = Y % M,这样的话,只要保证Y取最小值就可以得到最小的点亮的灯数和最大的被两盏灯照亮的边数
#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;#define maxn 1010#define M 2000vector<int> tree[maxn];int dp[maxn][2], vis[maxn][2];int dfs(int i, int j, int f) {if(vis[i][j])return dp[i][j];vis[i][j] = 1;int &ans = dp[i][j];int size = tree[i].size();ans = M;for(int k = 0; k < size; k++)if(tree[i][k] != f)ans += dfs(tree[i][k],1,i);if(f >= 0 && !j)ans++;if(j || f < 0) {int tmp = 0;for(int k = 0; k < size; k++)if(tree[i][k] != f)tmp += dfs(tree[i][k],0,i);if(f >= 0)tmp++;ans = min(ans,tmp);}return ans;}int main() {int test, n, m, a, b;scanf("%d",&test);while(test--) {scanf("%d%d", &n, &m);memset(vis,0,sizeof(vis));for(int i = 0; i < n; i++)tree[i].clear();for(int i = 0; i < m; i++) {scanf("%d%d",&a, &b);tree[a].push_back(b);tree[b].push_back(a);}int ans = 0;for(int i = 0; i < n; i++)if(!vis[i][0])ans += dfs(i,0,-1);printf("%d %d %d\n",ans / M, m - ans % M, ans % M);}return 0;}
0 0
- UVA - 10859 Placing Lampposts 暴力+森林+技巧
- Uva-10859-Placing Lampposts
- UVA 10859 Placing Lampposts
- UVa 10859 Placing Lampposts
- UVa 10859 Placing Lampposts
- UVA--10859--Placing Lampposts--DP
- Uva - 10859 - Placing Lampposts(树形dp)
- Uva 10859 - Placing Lampposts 树形dp
- uva 10859 Placing Lampposts 树形dp
- uva 10859 Placing Lampposts (树形dp)
- UVA 10859 Placing Lampposts (动态规划)
- UVa 10859 Placing Lampposts / 树形DP
- uva 10859 - Placing Lampposts(树形dp)
- UVa:10859 Placing Lampposts(树形DP)
- Placing Lampposts - UVa 10859 树形dp
- UVA 10859 Placing Lampposts 树形dp(水
- uva 10859 Placing Lampposts 树形dp
- uva 10859 Placing Lampposts,树形dp
- 批量删除数据库记录的ASP代码
- HBase 常用Shell命令
- Android 自定义View (一)
- 删除线性表中所有值为x的数据元素
- 《论语》阅读摘记
- UVA - 10859 Placing Lampposts 暴力+森林+技巧
- android NDK开发、编译、调试环境搭建与操作入门
- 创业者的新春礼包—优秀免费资源300+
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法
- iOS开发UI基础—简单介绍静态单元格的使用
- linux例行性工作
- Android Spannable的使用
- Repeater在ItemDataBound事件中取出前行的内容
- uva1593