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