題意:
有n個房間(n <= 100),每個房間有乙個點權(第1號房間和第n號房間權值均為0),到達該房間時會自動獲得該點權(權值可能為負,範圍是-100~+100).給出一些有向邊。有乙個人,初始能量值為100,初始位置是第一號房間,要走到第n號房間,且路途中不得使身上能量值小於或等於0(必須大於0).能到達第n個房間就算贏,問是否能贏。
解題思路:
先用floyd判斷圖是否連通,能否從1號點走到n號點。
再用spfa跑最長路,標記每個點進入佇列的次數。如果乙個點進入佇列的次數==n,則該點在正環中,將該點賦值為inf。
如果乙個點進入佇列的次數》n,則不再用該點去鬆弛其它點,而是直接continue;
注意:由於該題給出的資料是到達每個點的能量值,而不是邊的能量值。再加上要跑floyd判斷連通性,因此用鄰接矩陣來存圖,不使用鄰接表。
**:
#include #include #include #include using namespace std;
const int maxn = 105;
const int inf = 0x3fffffff;
bool p[maxn][maxn];
bool f[maxn][maxn];
int n;
int pow[maxn];
int book[maxn];
int cnt[maxn];
int dis[maxn];
void floyd()
bool spfa(int x)
}// q.pop();
book[x] = 0;
} return dis[n] > 0;
}int main()
} floyd();
if(spfa(1) && f[1][n])
printf("winnable\n");
else
printf("hopeless\n");
} return 0;
}
ural 1227 dfs判環 求最長路
問題可以簡化為求最長路,因為邊權均為正,所以有環即意味著最長路是正無窮必定有解 而無環的情況可以以每個點為起點進行dfs求出以該點為起點的最長路如果不小於s即有解。1 include 2 include 3 include 4 using namespace std 56 const int inf...
hdu 6201 樹形dp SPFA最長路
n個城市都在賣一種書,該書的 在i城市為cost i 商人打算從某個城市出發到另乙個城市結束,途中可以在任意城市買書或者賣書,但一次只能買一本和賣一本,乙個城市到另乙個城市需要花費。問商人最大收益是多少。方法一 樹形dp 設dp u 0 表示在以u為根的樹中賣一本書獲得的最大價值,dp u 1 表示...
HDU3721 列舉 最長路
題意 給你一顆n個節點n 1條邊的樹,每條邊都有乙個權值,現在讓你任意移動一條邊然後把這條邊連線到任意兩個點上,最後問你怎樣移動才能使樹上相距最遠的兩個點距離最小。思路 先求出樹的最長路,然後列舉移動最長路上的所有邊,移走這條邊後,原樹必定分為不連線的兩顆子樹,分別求這兩顆子樹的最長路,然後分別找到...