欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

 

相关标签: acm HDU SPFA