Uva 10557 XYZZY

来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/06/05 07:24
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1498

题意的意思是给你n个房间,每个房间有一个价值,每个房间可以通向一些其他的房间,然后每个房间可以访问多次= =里面的价值也可以多次取,问你是否能够从1房间走到n房间,走的路程中价值要大于0,初始的价值为100。。

这题说到底还是搜索。。。。但是当图中存在正环的时候,那么就可以直接从搜索所有路径看是否存在到终点的路径,如果不存在的话,就老老实实搜索是否能够保持在大于0的价值走到终点

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#include<vector>using namespace std;int n;int a[150];int vis[150];int d[150];vector<int>V[150];int dfs(int u){    if(u==n)    return 1;    vis[u]=1;    for(int i=0;i<V[u].size();i++)    {        int v=V[u][i];        if(!vis[v])        {         if(dfs(v))         return 1;         }    }    return 0;}int DFS(int u,int E){    if(u==n)    return 1;    d[u]=E+a[u];    for(int i=0;i<V[u].size();i++)    {        int v=V[u][i];        if(d[u]+a[v]>0)        {            if(!d[v])//表示v未访问过 ,直接访问             {            if(DFS(v,d[u]))            return 1;            }                    else if(d[u]+a[v]>d[v])//访问过,看看是否能够成正环,如果能成正环,直接从该点搜索看是否能够到达重点              {                 memset(vis,0,sizeof(vis));                if(dfs(v))                return 1;            }        }    }    return 0;}int main(){    int m,k;    while(scanf("%d",&n)!=EOF&&n!=-1)    {        memset(a,0,sizeof(a));        memset(d,0,sizeof(d));        for(int i=1;i<=n;i++)        V[i].clear();        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            scanf("%d",&m);            for(int j=0;j<m;j++)            {                scanf("%d",&k);                V[i].push_back(k);            }        }        if(DFS(1,100))        {            printf("winnable\n");        }        else        printf("hopeless\n");    }    return 0;}

 

0 0