HDU 1054:Strategic Game
2016-02-07 13:18
495 查看
Strategic Game
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6586 Accepted Submission(s): 3066
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
JGShining | We have carefully selected several similar problems for you: 1068 1150 1151 1281 1142
迷失在幽谷中的鸟儿,独自飞翔在这偌大的天地间,却不知自己该飞往何方……
#include<cstdio> #include<cstring> #include<vector> using namespace std; int bb[1510],aa[1510],n; vector<int> G[1510]; bool find(int k) { for(int j = 0; j < (int)G[k].size(); j++) { int i = G[k][j]; if(!aa[i]) { aa[i] = 1; if(bb[i] == -1 || find(bb[i])) { bb[i] = k; return true; } } } return false; } int main() { int a, b, c; while(~scanf("%d", &n)) { for(int i = 0; i < 1510; i++)G[i].clear(); for(int i = 0; i < n; i++) { scanf("%d:(%d)", &a, &c); for(int j = 0; j < c; j++) { scanf("%d", &b); G[a].push_back(b); G[b].push_back(a); } } c = 0; memset(bb, -1, sizeof(bb)); for(int i = 0; i < n; i++) { memset(aa, 0, sizeof(aa)); if(find(i)) c++; } printf("%d\n",c>>1); } return 0; }
相关文章推荐
- Terrier文档翻译:配置概述
- python一段代码 感受一下
- hdu 5621 KK's Point Bestcoder #71 1002
- tsiLnoititraP.86
- C 函数 strstr 的高效实现
- linux oracle设置环境变量
- HDU 1053:Entropy
- 二维码生成(利用iOS CoreImage框架)
- Terrier文档翻译:组件
- unix网络编程 str_cli epoll 非阻塞版本
- 平台其他说明
- Linux系统启动和关闭oracle数据库
- vs2013中经常会遇到XXX与XXXXX不兼容
- could not open parameter file "..../product/11.2/db_1/dbs/initorcl.ora
- install cinnamon on ubuntu 14.04
- B - Numbers That Count
- 判断是否是同一天
- MongoDB仲裁节点的理解以及memcached,zookeeper,redis,故障恢复方案思考.
- Algorithm, Counting sort
- 递归(图的遍历)2