You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
#define CRP(t, x) const t &x
|
|
#define OPL(t, x) bool operator<(CRP(t, x)) const
|
|
#define FIL(x, v) memset(x, v, sizeof(x))
|
|
#define CLR(x) FIL(x, 0)
|
|
#define NE1(x) FIL(x, -1)
|
|
#define INF(x) FIL(x, 0x3f)
|
|
#ifndef _DEBUG
|
|
#define _DEBUG 0
|
|
#endif // !_DEBUG
|
|
#define IFD if (_DEBUG)
|
|
typedef long long ll, i64;
|
|
const int maxn = 1e5 + 5;
|
|
int n, m;
|
|
int t[maxn];
|
|
vector<int> gid[maxn];
|
|
vector<int> grp[maxn];
|
|
ll dis1[maxn], dis2[maxn];
|
|
void dijkstra(int S, ll *dis)
|
|
{
|
|
struct heap_node
|
|
{
|
|
int u;
|
|
ll d;
|
|
OPL(heap_node, rhs) { return d > rhs.d; }
|
|
};
|
|
priority_queue<heap_node> H;
|
|
H.push({S, dis[S] = 0});
|
|
for (heap_node cur; !H.empty(); H.pop())
|
|
for (int g : gid[(cur = H.top()).u])
|
|
for (int to : grp[g])
|
|
if (dis[to] > dis[cur.u] + t[g])
|
|
H.push({to, dis[to] = dis[cur.u] + t[g]});
|
|
}
|
|
int main()
|
|
{
|
|
|
|
int T;
|
|
cin >> T;
|
|
for (int _ = 1; _ <= T; _++)
|
|
{
|
|
scanf("%d%d", &n, &m);
|
|
memset(dis1, 0x3f, sizeof(ll) * (n + 2));
|
|
memset(dis2, 0x3f, sizeof(ll) * (n + 2));
|
|
for (int i = 1; i <= n; i++)
|
|
gid[i].clear();
|
|
for (int i = 0, cnt; i < m; i++)
|
|
{
|
|
grp[i].clear();
|
|
scanf("%d%d", t + i, &cnt);
|
|
for (int j = 0, x; j < cnt; j++)
|
|
{
|
|
scanf("%d", &x);
|
|
gid[x].push_back(i);
|
|
grp[i].push_back(x);
|
|
}
|
|
}
|
|
dijkstra(1, dis1);
|
|
dijkstra(n, dis2);
|
|
ll mx = LLONG_MAX;
|
|
for (int i = 1; i <= n; i++)
|
|
mx = min(mx, max(dis1[i], dis2[i]));
|
|
IFD
|
|
{
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%lld%c", dis1[i], " \n"[i == n]);
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%lld%c", dis2[i], " \n"[i == n]);
|
|
}
|
|
printf("Case #%d: ", _);
|
|
ll inf = *dis1 >> 1;
|
|
if (mx >= inf)
|
|
puts("Evil John");
|
|
else
|
|
{
|
|
printf("%lld\n", mx);
|
|
for (int i = 1; i <= n; i++)
|
|
if (mx == max(dis1[i], dis2[i]))
|
|
printf("%d ", i);
|
|
putchar('\n');
|
|
}
|
|
}
|
|
return 0;
|
|
} |