您的位置:首页 > 理论基础 > 计算机网络

广东工业大学2016校赛决赛-网络赛 A题 Krito的讨伐

2016-04-12 20:51 627 查看


Problem A: Krito的讨伐


Description

Krito终于干掉了99层的boss,来到了第100层。第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点可能有很多只怪物。 Krito现在在0号节点,现在它想要区清除这一层所有的怪物。他现在有atk大小的攻击力。只有当你的攻击力大于这只怪物的防御力时,你才可以打败他,同时每打败只怪物,你会获得一定的攻击力加成。一个节点可能存在着不止一只怪兽,你要打败这个节点的所有怪物才能可以从这个节点通过,请问他能不能完成这个任务?注意:不要求一次性杀光一个节点里面的所有怪物。
相关知识: 摘自维基百科 	在计算机科学中,树(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质的资料集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1.每个节点有零个或多个子节点; 2.没有父节点的节点称为根节点; 3.每一个非根节点有且只有一个父节点; 4.除了根节点外,每个子节点可以分为多个不相交的子树;



Input

第1行:一个数T,表示有T个测试样例(0<=T<=50) ,接下来有T个测试样例

对于每一个测试样例:

第1行:两个整数n,m表示这棵树有n个节点,m只怪兽(0<=n<=1000 ,0<=m <=100)

第2至n-1行: 两个整数u,v表示编号为u,v之间的节点有一条无向边,题目保证不会成环。(0<=u,v<n , u!=v)

第3行: 一个整数atk,表示Krito的初始化攻击力(0<=atk<=100)

第4至3+m行:两个整数id,def,add_atk,表示在编号为id的点上,有一只防御力为def的怪物,打败后可以增加add_atk点的攻击力。(0<=add_atk,def<=100)


Output

对于每一个测试样例,如果Krito能够清除所有的怪物,则输出“Oh yes.” 否则,输出“Good Good Study,Day Day Up.”


Sample Input

15 20 10 22 32 4113 10 21 11 0


Sample Output

Oh yes.


HINT

解题思路:从根节点dfs依次把所有可达的怪物加到一个优先队列,每次从队列中取出一个判断是否满足题意,如果不满足则退出,满足则增加攻击力,并把该节点上的怪物数量减一,并从该节点开始dfs把所有可达怪物加到优先队列即可。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <cctype>
#include <cstdlib>
#include <sstream>
#define sqr(x) ((x)*(x))
#define lson le,mid,rt<<1
#define rson mid+1,ri,rt<<1|1
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
using namespace std;
const double PI = 4.0*atan(1.0);
const int maxn = 1010;

struct node{
int id, def, add_atk;
node(){}
node(int a,int b,int c){def = a; add_atk = b;id = c;}
int operator<(const node &n) const{
return def > n.def;
}
};

vector<int> ve[maxn];
vector<node> vn[maxn];
int atk, m, n, cnt[maxn], vis[maxn];
priority_queue<node> pq;

void dfs(int root){
if(cnt[root] != 0){
for(int i = 0;i < vn[root].size();++i)
pq.push(vn[root][i]);
vn[root].clear();
return;
}
for(int i = 0;i < ve[root].size();++i){
if(!vis[ve[root][i]]){
vis[ve[root][i]] = 1;
dfs(ve[root][i]);
}
}
}

bool solve(){
int root = 0;
while(!pq.empty())	pq.pop();
vis[root] = 1;
dfs(root);
while(!pq.empty()){
node t = pq.top();
pq.pop();
if(atk <= t.def){
return 0;
}
atk += t.add_atk;
root = t.id;
cnt[root]--;
dfs(root);
}
return 1;
}

int main(){
int T,a,b,c;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i = 0;i <= n;++i){
ve[i].clear();
vn[i].clear();
}
for(int i = 0;i < n-1;++i){
scanf("%d%d",&a,&b);
ve[b].push_back(a);
ve[a].push_back(b);
}
scanf("%d",&atk);
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
for(int i = 0;i < m;++i){
scanf("%d%d%d",&a,&b,&c);
vn[a].push_back(node(b,c,a));
cnt[a]++;
}
printf(solve()?"Oh yes.\n":"Good Good Study,Day Day Up.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: