Bribing FIPA: HDU-2415, POJ-3345


Bribing FIPA: POJ-3345
Description
There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) to determine the host of the next IPWC (International Programming World Cup). Benjamin Bennett, the delegation of Diamondland to FIPA, is trying to seek other delegation's support for a vote in favor of hosting IWPC in Diamondland. Ben is trying to buy the votes by diamond gifts. He has figured out the voting price of each and every country. However, he knows that there is no need to diamond-bribe every country, since there are small poor countries that take vote orders from their respected superpowers. So, if you bribe a country, you have gained the vote of any other country under its domination (both directly and via other countries domination). For example, if C is under domination of B, and B is under domination of A, one may get the vote of all three countries just by bribing A. Note that no country is under domination of more than one country, and the domination relationship makes no cycle. You are to help him, against a big diamond, by writing a program to find out the minimum number of diamonds needed such that at least m countries vote in favor of Diamondland. Since Diamondland is a candidate, it stands out of the voting process.
Input
The input consists of multiple test cases. Each test case starts with a line containing two integers n (1 ≤ n ≤ 200) and m (0 ≤ m ≤ n) which are the number of countries participating in the voting process, and the number of votes Diamondland needs. The next n lines, each describing one country, are of the following form:
CountryName DiamondCount DCName1 DCName1 ...
CountryName, the name of the country, is a string of at least one and at most 100 letters and DiamondCount is a positive integer which is the number of diamonds needed to get the vote of that country and all of the countries that their names come in the list DCName1 DCName1 ... which means they are under direct domination of that country. Note that it is possible that some countries do not have any other country under domination. The end of the input is marked by a single line containing a single # character.
Output
For each test case, write a single line containing a number showing the minimum number of diamonds needed to gain the vote of at least m countries.
Sample Input
3 2
Aland 10
Boland 20 Aland
Coland 15
#
Sample Output
20
http://blog.csdn.net/shuangde800/article/details/10276541
有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价,  其中有一些国家是老大和小弟的关系,也就是说,如果你获得了某个老大国家的支持, 那么这个国家的所有小弟(包括小弟的小弟...递归下去)都会无偿免费支持你。 问最少的花费可以得到m个国家的支持.

老大和小弟的关系, 其实就是组成了一棵棵的树,那么所有国家的关系就是一个森林。
为了方便进行树形dp, 在增加一个“超级根节点”,森林里所有树的根节点是“超级根节点”的儿子。
那么,用f(i, j)表示子树i, 获取j个国家支持的最少花费
对于子树i,所有节点i的儿子节点都是一组物品,
对于某个儿子,可以选择让他支持1,2..,j个, 那么就是对所有儿子进行分组背包了。。
用tot[v]表示子树v的节点个数
状态转移为:

f[u][i] = min{ f[u][i], f[u][i-j] + f[v][j] | 1<=j<=tot[v] && j<=i && v是u的儿子 };

http://blog.csdn.net/zhanghan735/article/details/9388443
由于可能有多个国家没有被控制,即其关系森林,可以加一个点0,让所有没被控制的国家成为o点的附属国
dp[i][k]表示以i为顶点的子树下贿赂k个国家需要的最少钱数:
当其为叶子结点时dp[i][0]=0;dp[i][1]=cost[i]
当其不是叶子结点 时:dp[i][k]=min(dp[i][k],dp[i][k-j]+dp[t][j])(t是i的子树顶点)
  1. map<string,int> pq;  
  2. int maze[N][N];  
  3. int dem[N][2];//dem[i][0]表示贿赂i国需要的花费,dem[i][1]表示i国控制的国家数+自己  
  4. int indeg[N];//每个点的入度  
  5. int p;  
  6. int n,m;  
  7. int dp[N][N];//d[i][j]表示以i为顶点的子树中选j个需要的花费  
  8. int dfs(int s)  
  9. {  
  10.     int num=1;  
  11.     if(s==0)num=0;  
  12.   
  13.     if(dem[s][1]==1&&s!=0)  
  14.     {  
  15.         dp[s][0]=0;  
  16.         dp[s][1]=dem[s][0];  
  17.         return 1;  
  18.     }  
  19.     for(int i=1;i<=n;i++)  
  20.     {  
  21.         if(maze[s][i]==0)  
  22.             num+=dfs(i);  
  23.     }  
  24.     dp[s][0]=0;  
  25.     for(int i=1;i<=n;i++)   //这里是表示两个子树的合并,要仔细理解  
  26.     {  if(maze[s][i]==-1)continue;  
  27.         for(int k=n;k>=0;k--)    
  28.         {  
  29.              for(int j=1;j<=k;j++)  
  30.              {  
  31.                  if(dp[s][k-j]!=-1&&dp[i][j]!=-1)  
  32.                  {  if(dp[s][k]!=-1)  
  33.                      dp[s][k]=min(dp[s][k],dp[s][k-j]+dp[i][j]);  
  34.                      else  
  35.                        dp[s][k]= dp[s][k-j]+dp[i][j];  
  36.   
  37.                  }  
  38.   
  39.              }  
  40.         }  
  41.     }  
  42.     if(dp[s][num]==-1||dp[s][num]>dem[s][0])  
  43.          dp[s][num]=dem[s][0];  
  44.     return num;  
  45. }  
  46. int main()  
  47. {  
  48.     char c1[20],c2[20];  
  49.      //freopen("in.txt","r",stdin);  
  50.    string s1,s2;  
  51.     while(scanf("%s %s",c1,c2)&&c1[0]!='#')//#是表示在文件的结尾,不是每组输入的结尾  
  52.     {  
  53.         sscanf(c1,"%d",&n);  
  54.         sscanf(c2,"%d",&m);  
  55.         getchar();  
  56.         p=1;  
  57.          memset(maze,-1,sizeof(maze));  
  58.          memset(indeg,0,sizeof(indeg));  
  59.       for(int i=0;i<n;i++)  
  60.          {   cin>>s1;  
  61.             if(pq[s1]==0)  
  62.                  pq[s1]=p++;  
  63.                  int s=pq[s1];  
  64.             cin>>dem[s][0];  
  65.   
  66.             dem[s][1]=1;  
  67.             char ch=getchar();  
  68.             while(ch!='\n')  
  69.             {  
  70.                 cin>>s2;  
  71.                 if(pq[s2]==0)  
  72.                     pq[s2]=p++;  
  73.                 maze[s][pq[s2]]=0;  
  74.                 indeg[pq[s2]]++;  
  75.                 dem[s][1]++;  
  76.                 ch=getchar();  
  77.             }  
  78.   
  79.          }  
  80.          dem[0][0]=0;  
  81.          dem[0][1]=1;  
  82.          for(int i=1;i<=n;i++)  
  83.              if(indeg[i]==0)  
  84.                    {maze[0][i]=0;  
  85.                     dem[0][1]++;  
  86.                     dem[0][0]+=dem[i][0];  
  87.                    }  
  88.         memset(dp,-1,sizeof(dp));  
  89.   
  90.          dfs(0);  
  91.         int ans=inf;  
  92.             for(int j=m;j<=n;j++)  
  93.               if(dp[0][j]!=-1&&dp[0][j]<ans)  
  94.                  {ans=dp[0][j];  
  95.   
  96.                  }  
  97.       printf("%d\n",ans);  
  98.       pq.clear();  
  99.     }  
  100.     return 0;  
  101. }  

http://blog.csdn.net/shuangde800/article/details/10276541
vector<int>adj[MAXN];
map<string, int>name;
int cost[MAXN];
int f[MAXN][MAXN];
int tot[MAXN];
bool deg[MAXN];
vector<string>str[MAXN];
char buf[MAXN], buf2[MAXN];
int n, m;
inline void read() {
// clear
for (int i = 0; i <= n; ++i)
adj[i].clear(), str[i].clear();
name.clear();
int idx = 1;
// read
string buf;
for (int i = 1; i <= n; ++i) {
getline(cin, buf);
stringstream sin(buf);
string s;
int v;
sin >> s >> cost[i];
name[s] = i;
while (sin >> s) {
str[i].push_back(s);
}
}
memset(deg, 0, sizeof(deg));
for (int i = 1; i <= n; ++i) {
for (int e = 0; e < str[i].size(); ++e) {
int v = name[str[i][e]];
adj[i].push_back(v);
deg[v] = true;
}
}
for (int i = 1; i <= n; ++i)
if (!deg[i])
adj[0].push_back(i);
}
int dfs(int u) {
tot[u] = 1;
// count vertex
for (int e = 0; e < adj[u].size(); ++e) {
int v = adj[u][e];
tot[u] += dfs(v);
}
// init
f[u][0] = 0;
f[u][1] = cost[u];
if (u) {
for (int i = 1; i <= tot[u]; ++i)
f[u][i] = cost[u];
}
// dp
for (int e = 0; e < adj[u].size(); ++e) {
int v = adj[u][e];
for (int i = tot[u]; i >= 1; --i) {
for (int j = 1; j <= tot[v] && j <= i; ++j)
f[u][i] = min(f[u][i], f[u][i-j] + f[v][j]);
}
}
return tot[u];
}
int main(){
while (gets(buf) && buf[0] != '#'){
sscanf(buf, "%d%d", &n, &m);
read();
memset(f, INF, sizeof(f));
dfs(0);
int ans = INF;
for (int i = m+1; i <= n+1; ++i)
ans = min(ans, f[0][i]);
printf("%d\n", ans);
}
return 0;
}



Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts