Placing Lampposts

来源:互联网 发布:unity3d 布料系统demo 编辑:程序博客网 时间:2024/05/16 09:13

树上的DP,有俩个优化条件在照亮所有的路径的情况下使用的路灯的数量最少x1,且在使用灯最少的情况下使得被俩个灯同时照亮的路最多(可以转化为使得只被一个路灯照的路径最少x2),这种优化条件可以用x = M*x1+x2作为目标函数

记忆化搜索


#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <cstring>#include <stack>#include <cctype>#include <utility>#include <map>#include <string>#include <climits> #include <set>#include <string> #include <sstream>#include <utility>#include <ctime>//#pragma comment(linker, "/STACK:1024000000,1024000000") using std::priority_queue;using std::vector;using std::swap;using std::stack;using std::sort;using std::max;using std::min;using std::pair;using std::map;using std::string;using std::cin;using std::cout;using std::set;using std::queue;using std::string;using std::istringstream;using std::getline;using std::make_pair;using std::greater; const int MAXN(1010);const int MAXE(2010);const int M(2000);const int INFI((INT_MAX-1) >> 1);int table[MAXN][2];bool vis[MAXN][2];struct EDGE{int v;EDGE *next;};EDGE *first[MAXN];EDGE edge[MAXE];EDGE *rear;void init(){memset(first, 0, sizeof(first));rear = edge;}void insert(int tu, int tv){rear->v = tv;rear->next = first[tu];first[tu] = rear++;}int dfs(int cur, int fs, int f){if(vis[cur][fs])return table[cur][fs];int &ret = table[cur][fs];int temp = 0;for(EDGE *i = first[cur]; i; i = i->next)if(i->v != f)temp += dfs(i->v, 1, cur);temp += M;if(fs == 0 && f != -1)++temp;ret = temp;if(fs == 1 || f == -1){temp = 0;for(EDGE *i = first[cur]; i; i = i->next)if(i->v != f)temp += dfs(i->v, 0, cur);if(f != -1)++temp;ret = min(ret, temp);}vis[cur][fs] = true;return ret;}int main(){int T, n_case(0);scanf("%d", &T);while(T--){int n, m, tu, tv;scanf("%d%d", &n, &m);memset(vis, 0, sizeof(vis));init();for(int i = 0; i < m; ++i){scanf("%d%d", &tu, &tv);insert(tu, tv);insert(tv, tu);}int ans = 0;for(int i = 0; i < n; ++i)if(!vis[i][0])ans += dfs(i, 0, -1);printf("Case %d: %d %d %d\n", ++n_case, ans/M, m-ans%M, ans%M);}return 0;}


原创粉丝点击