HDU 4354 Missile(树形DP)

来源:互联网 发布:淘宝商家等级划分 编辑:程序博客网 时间:2024/05/29 19:00


题意:给出C个城市,这C个城市中每个都属于M个国家中的某个国家,然后敌人想炸毁K个国家的城市。两个国家如果有关系那么只能摧毁其中一个,保证不存在环,求出最小花费。

思路:一般这种计算最大值减最小值最小的题都是要枚举+验证。这题也是一样,先按照所有城市的x坐标排序,然后对于当前枚举的区间,用in数组表示每个国家有多少个城市在当前这个区间之内,然后树形DP求出最多可能这个区间内最多可以攻击多少城市。

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii pair<int, int>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int MAXN = 5050;//const int INF = 0x3f3f3f3f;int c, n, k, m;int dp[MAXN][2], in[MAXN];bool vis[MAXN];vector<int> G[MAXN];struct Node {int x, n;bool operator < (const Node& A) const {return x < A.x;} } node[MAXN];void dfs(int cur, int fa) {dp[cur][1] = 1;dp[cur][0] = 0;vis[cur] = 1;for(int i = 0; i < G[cur].size(); i++) {int u = G[cur][i];if(u==fa || !in[u]) continue;dfs(u, cur);dp[cur][0] += max(dp[u][1], dp[u][0]);dp[cur][1] += dp[u][0];}}bool check(int l, int r) {memset(vis, 0, sizeof(vis));int ans = 0;for(int i = 1; i <= n; i++) {if(!vis[i] && in[i]) {dfs(i, 0);ans += max(dp[i][0], dp[i][1]);}}if(ans >= k) return true;return false;}int solve() {int l = 1, r = k;LL ans = 1000000000000000;for(int i = 1; i <= k; i++) in[node[i].n]++;while(r<=c) {if(check(l, r)) {ans = min(ans, (LL)node[r].x-node[l].x);if(l<r) in[node[l].n]--, l++;else r++, in[node[r].n]++;}else r++, in[node[r].n]++;}if(ans == 1000000000000000) return -1;return ans;}int main() {    //freopen("input.txt", "r", stdin);int T, kase = 0;cin >> T;  while(T--) {scanf("%d%d%d%d", &c, &n, &k, &m);for(int i = 1; i <= n; i++) G[i].clear();memset(in, 0, sizeof(in));for(int i = 1, x, y; i <= c; i++) {scanf("%d%d", &x, &y);node[i].x = x;node[i].n = y;}sort(node+1, node+c+1);for(int i = 1, u, v; i <= m; i++) {scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}int ans = solve();printf("Case #%d: %d\n", ++kase, ans);}    return 0;}

0 0