hdoj 2437 Jerboas

原创 2012年03月26日 20:39:37

类型:拓扑排序

题目: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;
}





HDU 2437 Jerboas

深搜边
  • sky_miange
  • sky_miange
  • 2015年11月15日 20:29
  • 384

hdu 2437 Jerboas 最短路

解题思路: 这一题因为题目中“What's more, for some unknown reasons, it's true that start from any burrow, follows...
  • Summer_via
  • Summer_via
  • 2016年07月08日 23:27
  • 175

HDU 2437 Jerboas (剪枝搜索)

题意:给定一幅图,图上有两种点T,P.......一只跳鼠在一个T点作为起始点,它想通过图上的路到达某个P点,P点满足如下要求: (1).到达P点的途中路径权值为k的倍数 (2).尽量让路径权值取...
  • paradiserparadiser
  • paradiserparadiser
  • 2013年07月29日 18:30
  • 1224

hdu 2437 Jerboas(bfs,dfs)

Problem Description       Jerboas are small desert-living animals, which resemble mice with a long ...
  • u014634338
  • u014634338
  • 2015年08月15日 14:49
  • 297

*hdu 2437 DFS

个人感觉是很好的一道题~~ #include #include #include #define INF 0x3f3f3f3f using namespace std; const int M...
  • JustSteps
  • JustSteps
  • 2013年07月22日 13:00
  • 795

hdu 2437 Jerboas (建图+bfs+取余判重)

Jerboas Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • u010228612
  • u010228612
  • 2013年09月05日 21:16
  • 877

hdu2437

Jerboas Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • neuike
  • neuike
  • 2016年07月10日 18:57
  • 158

HDU-2437-Jerboas

Jerboas are small desert-living animals, which resemble mice with a long tufted tail and very long h...
  • sulisulisu
  • sulisulisu
  • 2016年07月09日 13:38
  • 134

HDU 2437 Jerboas (DFS + 同余剪枝,建图细节)

题意:n个顶点,m条边,有边权的图,每个点是有P,T标示区别的,现在要从s出发到顶点标示为p的点,要求路径最短,多解的话,要到达的顶点编号最小,无解是-1.剪枝:如果多次到达一个顶点的话,而且余数又相...
  • u013167299
  • u013167299
  • 2015年08月08日 14:39
  • 470

BZOJ 2437 兔兔与蛋蛋 (博弈论 二分图匹配)

2437: [Noi2011]兔兔与蛋蛋Time Limit: 10 Sec Memory Limit: 128 MB DescriptionInput输入的第一行包含两个正整数 n、m。 接...
  • w4149
  • w4149
  • 2017年09月22日 07:53
  • 168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdoj 2437 Jerboas
举报原因:
原因补充:

(最多只允许输入30个字)