標籤:
題目大意:有一種遊戲,遊戲裡面有N個房間,每個房間有相應的能量值,走入該房間就可以得到相應的能量值
現在你要從房間1出發,走到房間N,如果中途能量耗盡了,就表示輸了,反之,則為贏
解題思路:首先得判斷一下能不能到達N,這可以用Floyd去判斷
如果能直接走到N的話,就算贏,否則判斷一下,看是否有正環,且正環中有點能到N
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define N 110#define INF 0x3f3f3f3fusing namespace std;struct Edge { int from, to, dist; Edge() {} Edge(int from, int to, int dist): from(from), to(to), dist(dist){}};vector<Edge> edges;bool connect[N][N];int d[N], n;void init() { memset(connect, 0, sizeof(connect)); edges.clear(); int x, m, pow; for (int i = 1; i <= n; i++) { scanf("%d%d", &pow, &m); for (int j = 0; j < m; j++) { scanf("%d", &x); edges.push_back(Edge(i, x, pow)); connect[i][x] = true; } }}void Floyd() { for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) connect[i][j] = (connect[i][j] || (connect[i][k] && connect[k][j]));}bool BellmanFord() { for (int i = 2; i <= n; i++) d[i] = -INF; d[1] = 100; for (int i = 2; i <= n; i++) for (int j = 0; j < edges.size(); j++) { Edge &e = edges[j]; if (d[e.to] < d[e.from] + e.dist && d[e.from] + e.dist > 0) { d[e.to] = d[e.from] + e.dist; } } if (d[n] > 0) return true; for (int j = 0; j < edges.size(); j++) { Edge &e = edges[j]; if (d[e.to] < d[e.from] + e.dist && d[e.from] + e.dist > 0) { d[e.to] = d[e.from] + e.dist; if (connect[e.to][n]) return true; } } return false;}void solve() { Floyd(); if (!connect[1][n] || !BellmanFord()) printf("hopeless\n"); else printf("winnable\n");}int main() { while (scanf("%d", &n) != EOF && n != -1) { init(); solve(); } return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
HDU - 1317 XYZZY (floyd + 最長路)