#include<bits/stdc++.h>
using namespace std;
const int MXN=110,inf=0x3f3f3f3f;
int n,tot,head[MXN],d[MXN],inq[MXN],cnt[MXN];
struct Edge{
int to,nxt,d;
}edge[MXN*MXN];
void add(int u,int v,int dis){
Edge &e=edge[++tot];
e.nxt=head[u],head[u]=tot;
e.to=v,e.d=dis;
}
bool spfa(){
queue<int>q;
int now,to;
memset(d,-inf,sizeof(d));
memset(cnt,0,sizeof(cnt));
memset(inq,0,sizeof(inq));
d[1]=100,inq[1]=1,cnt[1]=1;
q.push(1);//头入队
while(q.size()){//往后找
now=q.front();
q.pop();
inq[now]=0;
for(int i=head[now];~i;i=edge[i].nxt){
if(d[now]+edge[i].d<=0) continue;//不行,换
to=edge[i].to;
if(d[to]<d[now]+edge[i].d){
d[to]=d[now]+edge[i].d;//最大能量的更新
if(!inq[to]){//看有没有去过这个房间
if(++cnt[to]>n) continue;//房间超了
if(cnt[to]==n) d[to]=inf;
q.push(to);
inq[to]=1;
}
}
}
}
return d[n] > 0;
}
int main(){
int dis, m, v;
while(scanf("%d",&n)&&~n){//多组样例,房间个数 ;~是按位取反
memset(head,-1,sizeof head),tot=0;
for(int i=1;i<=n; ++i){
scanf("%d%d",&dis,&m);//能量,数量
while(m--)scanf("%d",&v),add(i,v,dis);//离开后可以抵达的
}
printf("%s\n", spfa() ? "winnable" : "hopeless");
}
return 0;
}
【1317】XYZZY
最新推荐文章于 2024-10-01 23:05:47 发布