题目链接http://www.gdutcode.sinaapp.com/problem.php?cid=1039&pid=0
题意是问你能不能把每个节点的怪物都杀掉
优先队列的使用,防御力小的放前面,当该结点怪物被杀完,就放入队列。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
#define LL long long
struct Node
{
int id,def,add;
friend bool operator<(Node a,Node b)//自定义排序
//friend为友元函数,指某些虽然不是类成员却能访问类成员的函数。
{
return a.def>b.def;//def小的优先级高
}
};
bool g[1010][1010];
int cnt[1010];
vector <Node> v[1010];
bool vis[1010];
int n,m,k;
bool bfs()
{
priority_queue<Node> q;
for(int i=0;i<v[0].size();i++)
{
q.push(v[0][i]);
//printf("hahahha\n");
//printf("%d___\n",v[0][i]);
}
if(cnt[0]==0)
{
//printf("enter\n");
Node t={0,-1,0};
q.push(t);
}
vis[0]=1;
while(!q.empty())//如果不空
{
//printf("@\n");
Node t=q.top();
q.pop();
if(t.def==-1)//如果这个点的怪兽已经被杀死了
{
for(int i=0;i<n;i++)
{
if(!vis[i]&&g[t.id][i]==1)//判断有没有边以及有没走过这个点
{
vis[i]=1;
for(int j=0;j<cnt[i];j++)//这个点上的怪兽
{
q.push(v[i][j]);
//printf("%d___%d___%d___\n",v[i][j].id,v[i][j].def,v[i][j].add);
}
if(cnt[i]==0)//这个点上的怪兽被杀完了
{
Node x={i,-1,0};
q.push(x);
}
}
}
continue;
}
if(t.def<k)
{
k+=t.add;
if(--cnt[t.id]==0)
{
t.def=-1;
q.push(t);
}
}
else
return false;
}
return true;
}
int main (void)
{
int t;
cin>>t;
while(t--)
{
memset(cnt,0,sizeof(cnt));
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
v[i].clear();
}
cin>>n>>m;
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
g[a][b]=g[b][a]=1;
}
scanf("%d",&k);//初始攻击力
for(int i=0;i<m;i++)
{
int id,def,add;
scanf("%d %d %d",&id,&def,&add);
Node t={id,def,add};
v[id].push_back(t);
//printf("%d^^^%d^^^%d\n",v[id][cnt[id]].id,id,cnt[id]);
cnt[id]++;
}
//printf("cnt0=%d\n",cnt[0]);
if(bfs())
printf("Oh yes.\n");
else
printf("Good Good Study,Day Day up.\n");
}
return 0;
}