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 "); } else printf("hopeless "); } return 0; }