最短路(Bellman_Ford) POJ 1860 Currency Exchange
2015-04-24 20:50
477 查看
题目传送门
SPFA重写一遍
/* 最短路(Bellman_Ford):求负环的思路,但是反过来用,即找正环 详细解释:http://blog.csdn.net/lyy289065406/article/details/6645778 */ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <cmath> #include <queue> #include <map> #include <set> using namespace std; const int MAXN = 100 + 10; const int INF = 0x3f3f3f3f; const double EPS = 1e-8; struct NODE { int u, v; double r, c; }node[MAXN*2]; double d[MAXN]; bool Bellman_Ford(int s, int n, int tot, double V) { memset (d, 0, sizeof (d)); d[s] = V; bool flag; for (int i=1; i<=n-1; ++i) { flag = false; for (int j=1; j<=tot; ++j) { NODE e = node[j]; if (d[e.v] < (d[e.u] - e.c) * e.r) { d[e.v] = (d[e.u] - e.c) * e.r; flag = true; } } if (!flag) break; } for (int i=1; i<=tot; ++i) { NODE e = node[i]; if (d[e.v] < (d[e.u] - e.c) * e.r) return true; } return false; } int main(void) //POJ 1860 Currency Exchange { //freopen ("A.in", "r", stdin); int n, m, s; double V; while (~scanf ("%d%d%d%lf", &n, &m, &s, &V)) { int tot = 0; for (int i=1; i<=m; ++i) { int x, y; double rab, cab, rba, cba; scanf ("%d%d%lf%lf%lf%lf", &x, &y, &rab, &cab, &rba, &cba); //printf ("%d %d %lf %lf %lf %lf\n", x, y, rab, cab, rba, cba); node[++tot].u = x; node[tot].v = y; node[tot].r = rab; node[tot].c = cab; node[++tot].u = y; node[tot].v = x; node[tot].r = rba; node[tot].c = cba; } if (Bellman_Ford (s, n, tot, V)) puts ("YES"); else puts ("NO"); } return 0; }
SPFA重写一遍
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int N = 100 + 10; struct Edge { int v, nex; double r, c; Edge() {} Edge(int v, double r, double c, int nex) : v (v), r (r), c (c), nex (nex) {} }edge[N*2]; int head ; double d ; bool vis ; int cnt ; int n, m, e; double val; void init(void) { memset (head, -1, sizeof (head)); e = 0; } void add_edge(int u, int v, double r, double c) { edge[e] = Edge (v, r, c, head[u]); head[u] = e++; } bool SPFA(int s) { memset (vis, false, sizeof (vis)); memset (d, 0, sizeof (d)); memset (cnt, 0, sizeof (cnt)); d[s] = val; cnt[s] = 0; vis[s] = true; queue<int> que; que.push (s); while (!que.empty ()) { int u = que.front (); que.pop (); vis[u] = false; for (int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v; double r = edge[i].r, c = edge[i].c; if (d[v] < (d[u] - c) * r) { d[v] = (d[u] - c) * r; if (!vis[v]) { vis[v] = true; que.push (v); if (++cnt[v] > n) return true; } } } } return false; } int main(void) { int s; while (scanf ("%d%d%d%lf", &n, &m, &s, &val) == 4) { init (); for (int i=1; i<=m; ++i) { int u, v; double r1, c1, r2, c2; scanf ("%d%d%lf%lf%lf%lf", &u, &v, &r1, &c1, &r2, &c2); add_edge (u, v, r1, c1); add_edge (v, u, r2, c2); } if (SPFA (s)) puts ("YES"); else puts ("NO"); } return 0; }
相关文章推荐
- poj 1860 Currency Exchange (最短路bellman_ford思想找正权环 最长路)
- poj 1860 2378 3259带负边最短路 ** bellman ford 模板
- POJ1860 Currency Exchange 最短路bellman-ford
- POJ1860--Currency Exchange(最短路Bellman_Ford)
- Currency Exchange POJ - 1860 Bellman-Ford最短路
- POJ 1860 Currency Exchange(最短路 Bellman-Ford)
- Currency Exchange POJ - 1860 单源最短路 Bellman_Ford
- POJ1860——Bellman_ford——Currency Exchange
- POJ 1860 Currency Exchange bellman_ford
- POJ 3259 Wormholes(最短路Bellman_Ford)
- zoj 1544 || poj 1860 Currency Exchange(Bellman-ford)
- Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)
- POJ 1860 Currency Exchange(Bellman-Ford判断最长路是否含有正环)
- POJ 3169 Layout bellman_ford 最短路
- Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)
- POJ 1860 Currency Exchange (bellman-ford判负环)
- poj1860 & poj2240(Bellman-Ford)
- POJ 1860:Currency Exchange:bellman最短路变形进行盈利判环
- poj 1860 Currency Exchange(bellman-ford)
- POJ 1860 Currency Exchange 毫无优化的bellman_ford跑了16Ms,spfa老是WA。。