#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef pair<long long, long long> P;
const long long INF = 1e18;
const int maxn = 2 * 1e6;
bool vis[maxn];
int n, m;
long long dis1[maxn], dis2[maxn];
vector<P> G[maxn];
void dijkstra(int s, long long *dis) {
for (int i = 0; i <= n + m; i++) vis[i] = false, dis[i] = INF;
dis[s] = 0;
priority_queue<P, vector<P>, greater<P> > q; q.push(make_pair(0, s));
while (!q.empty()) {
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = true;
for (unsigned int i = 0; i < G[u].size(); i++) {
long long v = G[u][i].first, cost = G[u][i].second;
if (dis[v] > dis[u] + cost) {
dis[v] = dis[u] + cost;
q.push(make_pair(dis[v], v));
}
}
}
}
int main() {
int T; scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d %d", &n, &m);
for (int i = 0; i <= n + m; i++) G[i].clear();
for (int i = 1; i <= m; i++) {
int t, s, x; scanf("%d %d", &t, &s);
for (int j = 1; j <= s; j++) {
scanf("%d", &x);
G[x].push_back(make_pair(n + i, t));
G[n + i].push_back(make_pair(x, t));
}
}
dijkstra(1, dis1);
dijkstra(n, dis2);
long long ans = INF;
for (int i = 1; i <= n; i++) {
long long temp = max(dis1[i], dis2[i]);
ans = min(ans, temp);
}
printf("Case #%d: ", kase);
if (ans == INF) printf("Evil John\n");
else {
printf("%lld\n", ans / 2);
int flag = 0;
for (int i = 1; i <= n; i++) {
long long temp = max(dis1[i], dis2[i]);
if (temp == ans) {
if (flag++) printf(" ");
printf("%d", i);
}
}
printf("\n");
}
}
return 0;
}
HDU - 5521 Meeting——增点建边+最短路
最新推荐文章于 2018-10-07 17:14:37 发布