HDU 1317 XYZZY SPFA
程序员文章站
2024-02-24 22:17:16
...
这题一举刷新了我对SPFA的认知,不同的入队次数有不同的意义,我小叮当先记下了。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int dist[105],in[105],v[105];
bool vis[105];
int n;
vector<int> vec[105];
bool spfa()
{
queue<int> q;
memset(dist,0,sizeof(dist));
memset(vis,false,sizeof(vis));
memset(in,0,sizeof(in));
dist[1]=100; q.push(1);
while (!q.empty())
{
int u=q.front(); q.pop(); vis[u]=false;
in[u]++;
if (dist[n]>0) return true;
if (in[u]==n+2) continue;
if (in[u]==n+1) dist[u]=100000;
for (int i=0; i<vec[u].size(); i++)
{
if (dist[vec[u][i]]<dist[u]+v[vec[u][i]] && dist[u]+v[vec[u][i]]>0)
{
dist[vec[u][i]]=dist[u]+v[vec[u][i]];
if (!vis[vec[u][i]])
{
vis[vec[u][i]]=true; q.push(vec[u][i]);
}
}
}
}
return false;
}
int main()
{
while (~scanf("%d",&n) && n!=-1)
{
for (int i=1; i<=n; i++)
{
vec[i].clear(); int num;
scanf("%d%d",&v[i],&num);
for (int j=1; j<=num; j++)
{
int tmp; scanf("%d",&tmp);
vec[i].push_back(tmp);
}
}
if (spfa())
{
printf("winnable\n");
}else
{
printf("hopeless\n");
}
}
return 0;
}