无向无权图的最短路径
时间限制:1秒 内存限制:256M
【问题描述】
给出 \(n\) 个顶点(编号为 \(1\sim n\)),\(m\) 条边的无向连通无权简单图,请完成下列任务:
任务1、计算顶点 \(s\) 到顶点 \(t\) 的最短路径数目。
任务2、计算顶点 \(s\) 到顶点 \(t\) 的最短路径长度。然后输出最短路径经过的顶点序列,如果有多条,则输出顶点排列字典序最小的。
任务3、判断边 \((u,v)\) 是否在 \(s\) 到 \(t\) 的最短路径上。
【输入格式】
第一行包含两个整数:\(n,m\),表示图的顶点和边的数目。
接下来的 \(m\) 行,每行包含 2 个整数:\(a,b(1 ≤ a, b ≤ n)\),表示图的一条边关联的顶点为 \(a,b\)。
第 \(m+1\) 行包含两个整数 \(s,t(1<=s,t<=n且s!=t)\)。
第 \(m+2\) 行一个整数 \(q\),表示查询数目。
接下来的 \(q\) 行,每行包含两个整数:\(u,v\),表示查询边 \((u,v)\) 是否在 \(s\) 到 \(t\) 的最短路径上。
【输出格式】
第 1 行:一个整数表示 \(s\) 到 \(t\) 的最短数 \(mod\ (10^9+7)\)。如果存在 \(s\) 到 \(t\) 的最短路径,那么在第 2 行先输出 \(s\) 到 \(t\) 的最短距,接下来的若干整数表示 \(s\) 到 \(t\) 的一条字典序最小的最短路径序列。
接下来的 \(q\) 行,每行回答一个询问,若 \((u,v)\) 在最短路径上输出"Yes",否则输出"No"。
【输入输出样例】
Input
5 6
1 2
2 3
3 4
4 5
2 4
1 3
1 5
2
2 3
3 4
Output
2
3 1 2 4 5
No
Yes
【数据说明】
对于 \(100\%\) 的数据 \(1≤N≤50000\),\(1≤M≤100000\),\(1≤q≤10000\)。
【来源】
Mr.he