hdu---(1054)Strategic Game(最小覆盖边)

Strategic Game

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5034    Accepted Submission(s): 2297

Problem Description

Bob
enjoys playing computer games, especially strategic games, but
sometimes he cannot find the solution fast enough and then he is very
sad. Now he has the following problem. He must defend a medieval city,
the roads of which form a tree. He has to put the minimum number of
soldiers on the nodes so that they can observe all the edges. Can you
help him?

Your program should find the minimum number of soldiers that Bob has to put for a given tree.

The input file contains several data sets in text format. Each data set represents a tree with the following description:

the number of nodes
the description of each node in the following format
node_identifier:(number_of_roads) node_identifier1 node_identifier2 ... node_identifier
or
node_identifier:(0)

The
node identifiers are integer numbers between 0 and n-1, for n nodes (0
< n <= 1500). Every edge appears only once in the input data.

For example for the tree:

the solution is one soldier ( at the node 1).

The
output should be printed on the standard output. For each given input
data set, print one integer number in a single line that gives the
result (the minimum number of soldiers). An example is given in the
following table:

Sample Input

4
0:(1) 1
1:(2) 2 3
2:(0)
3:(0)
5
3:(3) 1 4 2
1:(1) 0
2:(0)
0:(0)
4:(0)

Sample Output

1
2

Source

Southeastern Europe 2000

Recommend

代码:  这里是最少覆盖边,开始一直搞最小覆盖点,然后各种不得劲,.....后面看了以下提示,然后就明白了。但是改了之后有开始tie,没办法,只能最后用起了邻接表(我用 的是vector来替代的)  最小覆盖点 =顶点数- 最大匹配数  、  最小覆盖边= 等于(无向图)最大匹配/2;

代码:

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<iostream>
 5 using namespace std;
 6 const int maxn=1550;
 7 vector<vector<int> >grid(maxn);
 8 bool vis[maxn];
 9 int savx[maxn];
10 int n;
11 int km(int x){
12     vector<int>::iterator it;
13   for(it=grid[x].begin();it<grid[x].end();it++){
14       if(!vis[*it]){
15            vis[*it]=1;
16       if(savx[*it]==-1||km(savx[*it])){
17         savx[*it]=x;
18         return 1;
19       }
20       }
21   }
22  return 0;
23 }
24
25 int main(){
26     int ans=0;
27     int a,b,c;
28     int km(int );
29     while(scanf("%d",&n)!=EOF){
30         ans=0;
31        memset(savx,-1,sizeof(savx));
32        for(int i=0;i<n;i++)
33           grid[i].clear();
34       for(int i=0;i<n;i++){
35            scanf("%d:(%d)",&a,&b);
36           for(int j=0;j<b;j++){
37          scanf("%d",&c);
38          grid[a].push_back(c);
39          grid[c].push_back(a);
40           }
41       }
42      for(int i=0;i<n;i++){
43        memset(vis,0,sizeof(vis));
44        ans+=km(i);
45      }
46     printf("%d\n",ans/2);
47     }
48  return 0;
49 }
时间: 2024-11-09 02:09:25

hdu---(1054)Strategic Game(最小覆盖边)的相关文章

hdu 1054 Strategic Game (二分匹配)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4697    Accepted Submission(s): 2125 Problem Description Bob enjoys playing computer games, especially strategic games, but somet

hdu 1054 Strategic Game (最小顶点覆盖+稀疏图)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4889    Accepted Submission(s): 2225 Problem Description Bob enjoys playing computer games, especially strategic games, but some

hdu 1054 Strategic Game 二分图最小点覆盖

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每个点拆成i和i'. 从超级源点向点i连一条边,容量为1. 从i’向超级汇点连一条边,容量为1. 从i向i'连一条边,容量为正无穷. 然后求最小割/2.因为拆点拆成了2个. 也可以用二分图匹配来做,也是求出最大匹配然后/2. 1 #include <bits/stdc++.h> 2 using na

hdu - 1054 - Strategic Game(树形dp)

题意:一棵n个结点的无根树(0 < n <= 1500),在一个结点放一个士兵,可以守护与这个点相邻的所有边,问最少需要多少个士兵,可以守护所有边. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 -->>状态: dp[i][1]表示以 i 为结点的子树,在 i 放一个士兵,可以守护所有边的最少士兵数. dp[i][0]表示以 i 为结点的子树,在 i 不放士兵,可以守护所有边的最少士兵数. 状态转移方程(结点 j 是结点 i

HDU 1054 Strategic Game 最小点覆盖

 最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后假如我们已经求得最小覆盖点集,那么在点集中每个点必然有着这样的性质,在于它相连的边里面,一定有一条边的端点不在最小点集中,因为如果连一条这样的边都没有,那这个点完全没有在最小点集的必要,我们任意选取这样的一条边,一定可以形成一个匹配,匹配数与最小点集中的点的个数相等,但现在这仅仅是一个匹配,他必然小于最大

HDU 1054 Strategic Game(树形DP)

Problem Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend a medieval city, the roads of which for

hdu 1054 Strategic Game 【匈牙利算法】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=1054 题意:求无向图的最小顶点覆盖 = 最大匹配数 / 2; 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functiona

HDU——1054 Strategic Game

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8504    Accepted Submission(s): 4094 Problem Description Bob enjoys playing computer games, especially strategic games, but some

HDU 1054 Strategic Game(无向二分图的最大匹配)

( ̄▽ ̄)" //凡无向图,求匹配时都要除以2 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int MAXN=1505; int uN; vector<int> g[MAXN]; int link[MAXN]; bool vis[MAX

HDU 1054 Strategic Game (树形dp)

题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点可以安排士兵,也可以不安排士兵.可以从各个子节点两个不同状态(存在士兵,不存在士兵)的最值中选出最小的消耗,然后相加就求出了当前节点派士兵的最小消耗. 2:以当前节点为根节点,不存在士兵.这种情况十分清楚,因为当前节点没有士兵,那么这个节点到子节点之间的道路没有人守护,那么子节点就必须要安排士兵,因此这种情况下.这个节点的最小消耗就是每个子节点存在士兵的情