HDU1317 最長路 判斷正環

2021-08-20 04:47:49 字數 1014 閱讀 9983

題意:

有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條邊的樹,每條邊都有乙個權值,現在讓你任意移動一條邊然後把這條邊連線到任意兩個點上,最後問你怎樣移動才能使樹上相距最遠的兩個點距離最小。思路 先求出樹的最長路,然後列舉移動最長路上的所有邊,移走這條邊後,原樹必定分為不連線的兩顆子樹,分別求這兩顆子樹的最長路,然後分別找到...