HDU 1317 XYZZY SPFA

這題一舉刷新了我對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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章