#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 15;
const int INF = 0x3f3f3f3f;
const int M = N * (N - 1) / 2;
struct HeapNode
{
int w, v;
bool operator < (const HeapNode &b) const
{
return w > b.w;
}
};
int first[N], next[M];
int v[M], w[M];
int e;
bool vis[N];
int d[N], p[N];
int n;
void addEdge(int a, int b, int c);
void init();
int dijkstra(int s, int t);
void output(int t);
int main()
{
int s, t;
int num;
int b, c;
int iCase = 1;
int step;
#ifndef ONLINE_JUDGE
freopen("d:\\OJ\\uva_in.txt", "r", stdin);
#endif
while (scanf("%d", &n) && n) {
init();
for (int i = 0; i < n; i++) {
scanf("%d", &num);
while (num--) {
scanf("%d%d", &b, &c);
addEdge(i, b - 1, c);
}
}
scanf("%d%d", &s, &t);
printf("Case %d: Path =", iCase++);
step = dijkstra(s - 1, t - 1);
output(t - 1);
printf("; %d second delay\n", step);
}
return 0;
}
void addEdge(int a, int b, int c)
{
v[e] = b;
w[e] = c;
next[e] = first[a];
first[a] = e;
e++;
}
void init()
{
e = 0;
memset(first, -1, sizeof(first));
memset(vis, false, sizeof(vis));
memset(p, -1, sizeof(p));
}
int dijkstra(int s, int t)
{
priority_queue<HeapNode> q;
for (int i = 0; i < n; i++) d[i] = ((i == s) ? 0 : INF);
q.push((HeapNode){0, s});
while (!q.empty()) {
HeapNode x = q.top(); q.pop();
if (x.v == t) return d[t];
if (vis[x.v]) continue;
vis[x.v] = true;
for (int u = first[x.v]; u != -1; u = next[u]) {
if (d[v[u]] > d[x.v] + w[u]) {
d[v[u]] = d[x.v] + w[u];
p[v[u]] = x.v;
q.push((HeapNode){d[v[u]], v[u]});
}
}
}
}
void output(int t)
{
if (t == -1) {
return;
}
output(p[t]);
printf(" %d", t + 1);
}
uva341 - Non-Stop Travel
最新推荐文章于 2019-11-24 15:50:54 发布