hdu2437 Jerboas

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2437

题意:求从起点开始到某个P点路径长度是k的倍数的最短路

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<algorithm>

using namespace std;

const int maxn = 1005;
int n, m, s, k, ans, ansv;
bool flag;
int bur[maxn];
int head[maxn];
bool vis[maxn][maxn];
struct P
{
    int u;
    int cost;
    int next;
} edge[maxn * maxn];

void DFS(int cur, int Cost)
{
    if(Cost % k == 0 && bur[cur])
    {
        flag = 1;
        if(ans > Cost)
        {
            ans = Cost;
            ansv = cur;
        }
        else if(ans == Cost && ansv > cur)
        {
            ansv = cur;
        }
        return ;
    }
    for(int i = head[cur]; i != -1; i = edge[i].next)
    {
        int u = edge[i].u;
        int c = edge[i].cost + Cost;
        if(!vis[u][c % k])
        {
            vis[u][c % k] = 1;
            DFS(u, c);
        }
    }
}

int main()
{
    int T, ca;
    cin >> T;
    ca = 1;
    while(T--)
    {
        ans = 1e9;
        ansv = maxn;
        flag = 0;
        memset(head, -1, sizeof(head));
        memset(vis, 0, sizeof(vis));
        string str;
        cin >> n >> m >> s >> k;
        cin >> str;
        for(int i = 1; i <= n; i++)
        {
            bur[i] = (str[i - 1] == 'P' ? 1 : 0);
        }
        for(int i = 0; i < m; i++)
        {
            int u, v, c;
            scanf("%d %d %d", &u, &v, &c);
            edge[i].u = v;
            edge[i].cost = c;
            edge[i].next = head[u];
            head[u] = i;
        }
        vis[s][0] = 1;
        DFS(s, 0);
        if(!flag)
        {
            printf("Case %d: -1 -1\n", ca++);
        }
        else
        {
            printf("Case %d: %d %d\n", ca++, ans, ansv);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值