hdoj 2437 Jerboas
来源:互联网 发布:一年java工资待遇 编辑:程序博客网 时间:2024/05/18 00:41
类型:拓扑排序
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2437
来源:2008 Asia Chengdu Regional Contest Online
思路:题目是求到某个满足条件的节点的最短路且路径长度为k的倍数。使用二维数组dist[i][j]记录当从源点到当前节点i且满足路径长度 % k = j时的最短路径长度
则最终结果为dist[i][0],i为P节点且长度最小。
因为该图为有向无环图,所以从i点到j点路径唯一,v节点的值只能由其前驱更新。所以可以以拓扑序列的顺序更新图中节点的dist值。
若dist[u][i]已知,则可以用dist[u][i] + w 更新f[v][(i + c) % k]的最优值。根据拓扑顺序的性质,知道递推式满足无后效性。
初值dist[s][0] = 0。
// hdoj 2437 Jerboas// re ac 109MS 4464K#include <iostream>#include <string>#include <queue>#include <stack>#include <algorithm>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;#define FOR(i,a,b) for(i = (a); i < (b); ++i)#define FORE(i,a,b) for(i = (a); i <= (b); ++i)#define FORD(i,a,b) for(i = (a); i > (b); --i)#define FORDE(i,a,b) for(i = (a); i >= (b); --i)#define CLR(a,b) memset(a,b,sizeof(a))#define PB(x) push_back(x)const int MAXN = 1010;const int MAXM = 20010;const int hash_size = 25000002;const int INF = 0x7f7f7f7f;char str[MAXN];int cnt, cas = 1;int n, m, s, k;int head[MAXN], ru[MAXN], dist[MAXN][MAXN];struct edge { int v, w, nxt;}e[MAXM];void addedge(int u, int v, int w) { e[cnt].v = v; e[cnt].w = w; e[cnt].nxt = head[u]; head[u] = cnt++;}void topo() { int i, j, u; dist[s][0] = 0; while(1) { FORE(u, 1, n) if(ru[u] == 0) break; if(u > n) break; for(i = head[u]; i != -1; i = e[i].nxt) { int v = e[i].v; --ru[v]; FOR(j, 0, k) { if(dist[u][j] == -1) continue; int len = dist[u][j] + e[i].w; int rem = len % k; if(dist[v][rem] == -1 || dist[v][rem] > len) dist[v][rem] = len; } } ru[u] = -1; }}void solve() { int i; int enddy = -1, enddz = -1; topo(); FORE(i, 1, n) { int tmpy = dist[i][0]; if(str[i] == 'P' && tmpy != -1 && (enddy == -1 || enddz > tmpy)) enddy = i, enddz = tmpy; } if(enddy == -1) printf("Case %d: -1 -1\n", cas++); else printf("Case %d: %d %d\n", cas++, enddz, enddy);}void init() { int i, u, v, w; CLR(head, -1); CLR(ru, 0); CLR(dist, -1); cnt = 0; scanf("%d %d %d %d", &n, &m, &s, &k); scanf("%s", str + 1); FORE(i, 1, m) { scanf("%d %d %d", &u, &v, &w); addedge(u, v, w); ++ru[v]; }}int main() { int t; scanf("%d", &t); while(t--) { init(); solve(); } return 0;}
- hdoj 2437 Jerboas
- HDU 2437 Jerboas
- HDU-2437-Jerboas
- hdu 2437 Jerboas(bfs,dfs)
- hdu 2437 Jerboas 最短路
- HDU 2437 Jerboas (剪枝搜索)
- hdu 2437 Jerboas (建图+bfs+取余判重)
- HDU-2437-Jerboas(BFS+优先队列)
- HDU 2437 Jerboas (DFS + 同余剪枝,建图细节)
- hdu2437 Jerboas --- dfs
- hdu2437 Jerboas (搜索+剪枝)
- Sicily 1908. Jerboas
- ACM-DFS之Jerboas——hdu2437
- HDOJ
- hdoj
- hdoj
- HDOJ
- hdoj 1568 && hdoj 5344 && hdoj 5444
- 实现各进制之间的转换
- Flex4 实现视频通话完整实例 二 服务器端
- void Validate(double x); ::Validate(2.0f);
- ASP.NET_SQL连接和关闭
- zoomla!逐浪CMS与您分享六种asp.net 如何防范SQL注入攻击技术
- hdoj 2437 Jerboas
- java中的内置注解Annotation
- Ubuntu下java环境配置
- jquery实现表格的收缩
- (连载)一步一步教你做黑白棋游戏(四)
- Flex AdvancedDataGrid表头合并
- 3.python 序列
- xml布局2
- 伤筋动骨100天(2)