const int INF = 0x3fffffff;
const int maxn = 1010;
int dis_max[maxn][maxn], dis_min[maxn][maxn];
int paces_max[maxn][maxn], paces_min[maxn][maxn];
bool visit[maxn];
int queue[maxn], n;
// flag == false 最大生成树 否则最小生成树
void spfa(int begin, int paces[maxn], int dis[maxn], vector<Edge> edge[maxn], bool flag)
{
int front = 0, rear = 0;
for (int i = 1; i <= n; i++)
{
paces[i] = i;
visit[i] = false;
dis[i] = flag ? INF : -INF;
}
dis[begin] = 0;
queue[rear++] = begin;
visit[begin] = true;
while (front != rear)
{
const int now = queue[front++ % maxn];
const int size = edge[now].size();
visit[now] = false;
for (int i = 0; i < size; i++)
{
const int end = edge[now][i].end;
const int time = dis[now] + edge[now][i].time;
if (flag ? time < dis[end] : time > dis[end])
{
dis[end] = time;
paces[end] = now;
if (!visit[end])
{
visit[end] = true;
queue[rear++ % maxn] = end;
}
}
}
}
}