spfa求最长路
来源:互联网 发布:dj香烟淘宝链接 编辑:程序博客网 时间:2024/06/06 04:48
http://poj.org/problem?id=1932
spfa求最长路,判断dist[n] > 0,需要注意的是有正环存在,如果有环存在,那么就要判断这个环上的某一点是否能够到达n点,如果能,就说明可以到达,否则,就说明不能。
1 /************************************************************************* 2 > File Name: poj1932.cpp 3 > Author: syhjh 4 > Created Time: 2014年03月04日 星期二 16时54分43秒 5 ************************************************************************/ 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm>10 #include <vector>11 #include <queue>12 using namespace std;13 14 const int MAXN = (100 + 10);15 const int inf = 0x3f3f3f3f;16 int n, st, energy[MAXN];17 int dp[MAXN], Count[MAXN];18 vector<int > g[MAXN];19 bool mark[MAXN];20 21 bool spfa()22 {23 for (int i = 1; i <= n; i++) dp[i] = -inf;24 memset(mark, false, sizeof(mark));25 memset(Count, 0, sizeof(Count));26 queue<int > que;27 que.push(1);28 dp[1] = 100;29 while (!que.empty()) {30 int u = que.front();31 que.pop();32 mark[u] = false;33 if (Count[u]++ > n || u == n) {34 st = u;35 return true;36 }37 for (int i = 0; i < (int)g[u].size(); i++) {38 int v = g[u][i];39 if (dp[u] + energy[v] > dp[v] && dp[u] + energy[v] > 0) {40 dp[v] = dp[u] + energy[v];41 if (!mark[v]) {42 mark[v] = true;43 que.push(v);44 }45 }46 }47 }48 return false;49 }50 51 void dfs(int u)52 {53 mark[u] = true;54 for (int i = 0; i < (int)g[u].size(); i++) {55 int v = g[u][i];56 if (!mark[v]) dfs(v);57 }58 }59 60 61 int main()62 {63 while (cin >> n && n != -1) {64 for (int i = 1; i <= n; i++) g[i].clear();65 for (int i = 1; i <= n; i++) {66 int u, k;67 cin >> energy[i] >> k;68 while (k--) {69 cin >> u;70 g[i].push_back(u);71 }72 }73 st = -1;74 if (spfa()) {75 memset(mark, false, sizeof(mark));76 dfs(st);77 if (mark[n]) {78 cout << "winnable" << endl;79 } else 80 cout << "hopeless" << endl;81 } else if (dp[n] > 0) {82 cout << "winnable" << endl;83 } else 84 cout << "hopeless" << endl;85 }86 return 0;87 }
0 0
- spfa求最长路
- hdu3696(spfa求最长路)
- hdu3696Farm Game(SPFA求最长路)
- hdu 1534(差分约束+spfa求最长路)
- hdu 6201 transaction transaction transaction (spfa求最长路)
- SDUT AOE关键路径 SPFA求最长路(倒序建路)
- poj 3592(强连连通分量+缩点+重建图形+spfa求最长路)
- zoj 3088 Easter Holidays (SPFA 求最长路 最短路 + 打印路径)
- POJ 3160 Father Christmas flymouse tarjan缩点+spfa求最长路
- Bellman_Ford变形求最长路+正权回路或spfa——POJ 1860
- poj 3160 Father Christmas flymouse (SCC缩点+SPFA求最长路)
- hdoj 1534 Schedule Problem 【差分约束】【SPFA求最长路】
- Easter Holidays(二次spfa求最短路、最长路+打印路径)
- poj 3160 Father Christmas flymouse 【SCC缩点 + 虚拟源点SPFA求最长路】
- POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】
- POJ 3592--Instantaneous Transference【SCC缩点新建图 && SPFA求最长路 && 经典】
- poj 3592 Instantaneous Transference (借助强连通分量求缩点在建图spfa求最长路)
- POJ 1716(spfa最长路
- loj 1210 (求最少的加边数使得图变成强连通)
- loj 1406(状态压缩)
- loj 1429(可相交的最小路径覆盖)
- poj上的dp专题
- poj 3895(求无向图的最大简单环)
- spfa求最长路
- FANN的图形用户界面形式
- hdu 3001(状压dp, 3进制)
- zoj 3471(状态压缩)
- 汇编考试小结
- 单调队列,斜率优化dp 专题
- zoj 3644(dp + 记忆化搜索)
- 线段树专题训练
- 并查集中的合并、删除操作